Sha*_*123 2 sql sql-server date
我正在尝试添加一种约束,以防止用户将来输入日期,我需要它在用户尝试这样做时引发错误。
这是我到目前为止所拥有的:
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'
Run Code Online (Sandbox Code Playgroud)
如果您使用的是 SQL Server,最简单的解决方案是添加一个CHECK CONSTRAINT来防止任何人输入超出 (SQL Server) 系统日期的日期。
ALTER TABLE Sale ADD CONSTRAINT CKC_SALE_SALEDATE CHECK (SaleDate <= GetDate());
Run Code Online (Sandbox Code Playgroud)
编辑1 关于OP关于向存储过程添加检查约束的评论
a 的好处CHECK CONSTRAINT是如果不禁用它就无法绕过它。
总会有这样的情况:有人在不经过您设置的存储过程的情况下插入/更新数据。该约束将防止输入不正确的数据。
编辑2 关于OP检查GetDate()时的错误
以下构造当前无法编译
If salemonth > GETDATE(Month(saledate))
or saleyear > GETDATE(YEAR(saledate))
Run Code Online (Sandbox Code Playgroud)
错误消息提示此处出现错误,GetDate() 函数不带任何参数。最有可能的是,我怀疑你打算写这样的东西
If salemonth > MONTH(GetDate())
or saleyear > YEAR(GetDate())
Run Code Online (Sandbox Code Playgroud)
编辑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)
Run Code Online (Sandbox Code Playgroud)