-1

我在 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_date并且start_date都是日期时间,而不是 null 我不明白为什么会出现错误:“将 varchar 数据类型转换为日期时间数据类型导致值超出范围。 ”如果我使用标准 varchar 日期时间格式(或者不是?)。如果我删除日期的时间部分,查询工作正常。

4

2 回答 2

9
29:59:59

应该是23吧?

于 2013-11-05T13:52:25.343 回答
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)。

我也不认为这个查询是完全正确的——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比较切换为>=)。

于 2013-11-05T13:52:44.817 回答