我设置了一个约束来检查列是否具有值GETDATE()
。列规则是接受大于或等于GETDATE()
的日期。
ALTER TABLE table1
ADD CONSTRAINT chk1 CHECK (date_column >= GETDATE ())
问题在于,当我将今天的日期输入到列中时,它会给出一个错误,表明它与约束冲突,否则如果我输入明天它接受它的日期。似乎是(=符号)不起作用。
我的问题是:问题是什么以及如何解决?
答案 0 :(得分:3)
如果您只是以mm / dd / yyyy的形式输入今天的日期,那将评估当天的午夜。当你将它与GetDate()进行比较时,它评估的是小于当前日期和时间你需要将GetDate()置于当天的开始。
尝试使用
cast(floor(cast(getdate() as float)) as datetime)
答案 1 :(得分:2)
我认为最实际的是将约束更改为此(由于其他人指出的原因):
ALTER TABLE table1
ADD CONSTRAINT chk1 CHECK (date_column >= CAST(GETDATE() as date))
您也可以选择将列的类型从datetime
更改为date
答案 2 :(得分:0)
你必须记住,GETDATE()也包括当前时间。 您的约束似乎允许任何值GreaterThanOrEqualTo当前Datetime戳记为其评估值。在这种情况下,我认为将来会是什么。我想看看你的客户端代码可以弥补这一点。 如果您只想与DATE进行比较,那么您需要将约束更改为以下内容。
检查(CONVERT(DATETIME,CONVERT(varchar(10),date_column,101))=> CONVERT(DATETIME,CONVERT(varchar(10),GETDATE(),101)))
这是一个简单的例子: SELECT GETDATE() 2011-04-26 20:39:11.240
SELECT CONVERT(DATETIME,CONVERT(varchar(10),GETDATE(),101)) 2011-04-26 00:00:00.000
答案 3 :(得分:0)
GETDATE返回当前日期和时间(下降到毫秒),不当前 DATE 。
SQL Server使用Date-Time数据类型。仅限日期(没有时间信息),时间默认为午夜(即00:00)。
如果您在没有时间的情况下输入今天的日期,则默认为午夜(即00:00)。今天午夜的日期总是早于GETDATE(包括当前时间)。
因此,您的“今天”日期(没有时间特定的午夜)将永远不会是> = GETDATE。但是明天午夜时分,因为它比GETDATE晚了。
实验:指定今天的日期,加上一个时间(比如一小时后)。它应该被接受。