作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试添加一种约束,以防止用户将来输入日期,我需要它在用户尝试这样做时引发错误。
这是我目前所拥有的:
Create Procedure CustomerBooks (@month int, @year int)
AS
BEGIN
SELECT
SaleNumber,
month(saledate) as SaleMonth, year(saledate) as SaleYear,
CustomerNumber, EmployeeNumber, SubTotal, GST, Total
FROM
sale
Where
month(saledate) = @month
and YEAR (saledate) = @year
End
If salemonth > GETDATE(Month(saledate))
or saleyear > GETDATE(YEAR(saledate))
begin
Raiserror ('Invalid entry, you cannot enter future dates',16,1)
end
EXEC dbo.CustomerBooks @month = '1', @year = '2012'
最佳答案
如果您使用的是 SQL Server,最简单的解决方案是添加 CHECK CONSTRAINT
以防止任何人输入超出 (SQL Server) 系统日期的日期。
ALTER TABLE Sale ADD CONSTRAINT CKC_SALE_SALEDATE CHECK (SaleDate <= GetDate());
编辑 1 关于 OP 关于向存储过程添加检查约束的评论
CHECK CONSTRAINT
的好处是如果不禁用它就无法绕过它。
总会有这样的情况,即有人在没有通过您设置的存储过程的情况下插入/更新数据。该约束将防止输入不正确的数据。
编辑 2 关于检查 GetDate() 时 OP 的错误
以下构造目前无法编译
If salemonth > GETDATE(Month(saledate))
or saleyear > GETDATE(YEAR(saledate))
错误消息提示这里有什么错误,GetDate() 函数不接受任何参数。很可能,我怀疑你打算写这样的东西
If salemonth > MONTH(GetDate())
or saleyear > YEAR(GetDate())
编辑3
通过使用以下 if/then/else 结构验证输入是否在未来可以完成。另一种选择是将输入转换为实际日期并进行检查。
IF (YEAR(GetDate()) < @year)
Raiserror ('Invalid entry, you cannot enter future dates',16,1)
ELSE IF (YEAR(GetDate()) = @year) AND (MONTH(GetDate()) < @month)
Raiserror ('Invalid entry, you cannot enter future dates',16,1)
关于sql - 日期不能是将来的 SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15803002/
我是一名优秀的程序员,十分优秀!