日期不能在将来的SQL中

时间:2013-04-04 05:15:08

标签: 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'

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:0)

使用触发器代替。

Create or replace trigger tri_name
before insert on  sale 
begin
If salemonth > GETDATE(Month(saledate)) or saleyear > GETDATE(YEAR(saledate))
then 
Raiserror ('Invalid entry, you cannot enter future dates',16,1)
end;
/

可能会对您有帮助。