gpt4 book ai didi

sql - 日期不能是将来的 SQL

转载 作者:行者123 更新时间:2023-12-02 05:09:01 25 4
gpt4 key购买 nike

我正在尝试添加一种约束,以防止用户将来输入日期,我需要它在用户尝试这样做时引发错误。

这是我目前所拥有的:

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 Fiddle Example

关于sql - 日期不能是将来的 SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15803002/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com