SQL:针对GETDATE()的列验证

时间:2011-04-27 00:18:30

标签: sql sql-server tsql

我设置了一个约束来检查列是否具有值GETDATE()。列规则是接受大于或等于GETDATE()的日期。

ALTER TABLE table1
ADD CONSTRAINT chk1 CHECK (date_column >= GETDATE ())

问题在于,当我将今天的日期输入到列中时,它会给出一个错误,表明它与约束冲突,否则如果我输入明天它接受它的日期。似乎是(=符号)不起作用。

我的问题是:问题是什么以及如何解决?

4 个答案:

答案 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晚了。

实验:指定今天的日期,加上一个时间(比如一小时后)。它应该被接受。