sql server 2012日期时间比较中的超出范围值

时间:2013-11-05 13:48:39

标签: sql-server datetime

我在sql server 2012中有这个查询:

SELECT CASE WHEN count(*) = 0 THEN 1 ELSE 0 END
FROM Table1
WHERE ('20131104 00:00:00' > end_date OR '20141104 29:59:59' < start_date)

Table1 end_datestart_date都是datetime,而不是null 我不明白为什么我收到错误:“将varchar数据类型转换为日期时间数据类型会导致超出范围的值。”如果我使用的是标准varchar日期时间格式(或者它不是?)。如果我删除日期的时间部分,查询工作正常。

2 个答案:

答案 0 :(得分:8)

29:59:59

应该是23岁,不是吗?

答案 1 :(得分:2)

所有版本的SQL Server的安全格式为YYYY-MM-DD'T'hh:mm:ss,因此将是:

 WHERE ('2013-11-04T00:00:00' > end_date OR '2014-11-04T23:59:59' < start_date)

(29应该是23,正如Colm指出的那样)。

我也不认为这个查询是完全正确的 - 2014-11-04T23:59:59将省略在最后一分钟内具有毫秒值的任何内容,例如2014-11-04T23:59:59.537。我通常建议使用datetime将其视为连续的,然后切换到半开放区间 - 但我无法将其与您当前的比较进行协调。一个预期的可能是:

 WHERE ('2013-11-04T00:00:00' >= end_date OR '2014-11-05T00:00:00' < start_date)

现在两者都只是午夜的日期,它们可能是:

 WHERE ('20131104' >= end_date OR '20141105' < start_date)

(注意,在这两种情况下,我已将end_date比较转换为>=)。