日期不能是将来的 SQL

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)

Lie*_*ers 5

如果您使用的是 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)

SQL 小提琴示例