SQL Server 2005:
以下观点
SELECT CONVERT(VARCHAR(20), keyedtimestamp, 101) as KeyedDate
FROM TMSSTATFILE_STATS a
WHERE (CONVERT(VARCHAR(20), a.KeyedTimestamp, 101) BETWEEN '03/01/2011' And '03/31/2011')
ORDER BY KeyedDate
截止日期为2011年3月2日至2011年3月31日。
如果我将第一个日期更改为03/00/2011
SELECT CONVERT(VARCHAR(20), keyedtimestamp, 101) as KeyedDate
FROM TMSSTATFILE_STATS a
WHERE (CONVERT(VARCHAR(20), a.KeyedTimestamp, 101) BETWEEN '03/00/2011' And '03/31/2011')
ORDER BY KeyedDate
现在提供日期3/1/2011至2011年3月31日的数据
KeyedTimestamp字段是DateTime,并且有时间与这些记录相关联。 2011年3月31日的所有记录都已计算在内。我知道我可以通过在第二个日期之间提供最大时间来实现这一点,所以我不是在寻找替代where子句,而是要理解为什么它忽略了第一个记录,尽管它包含了从31日开始。
它几乎就像检查2011年3月1日23:59:59一样,我希望我可以消除这种检查,我只关心日期,而不是时间
答案 0 :(得分:8)
不使用BETWEEN,避免在列上使用函数。函数意味着永远不会使用任何索引
WHERE
a.KeyedTimestamp >= '20110301' AND a.KeyedTimestamp < '20110401'
pre-SQL Server 2008 yyyymmdd是唯一的安全日期格式。
答案 1 :(得分:3)
您不应将日期时间转换为字符串。相反,将它们比作日期时间。听起来你正试图解决存储时间的问题:
Select DateAdd(d, DateDiff(d, 0, T.KeyedTimeStamp), 0) As KeyedDate
From TMSSTATFILE_STATS As T
Where T.KeyedTimeStamp >= '20110301'
And T.KeyedTimeStamp < DateAdd(m,1,'20110301')
应该注意DateTimeVal Between DateTimeA And DateTimeB
转换为DateTimeVal >= DateTimeA And DateTimeVal <= DateTimeB
。即,它包括两个端点。在上面的解决方案中,我将获得下个月的第一天,并要求所有值严格小于该值,这意味着将包括三月份的所有值,包括时间。最后,Select语句从所有返回的KeyedTimeStamp值中删除时间值。
答案 2 :(得分:2)
您是否尝试过转换为DATETIME
值(或类似值)然后进行比较?您正在比较字符串...我不知道'03/00/2011'
在概念上对BETWEEN
运算符的意义。坦率地说,我对你的结果有任何意义感到惊讶!
SQL Server 2008具有本机DATE
类型,不包括时间戳。
如果你没有时间戳的本机类型(你提到V9),你可以使用这样的东西:
SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, your_date_here))
取自Anatoly Lubarsky的博客:
http://blogs.x2line.com/al/archive/2006/02/17/1458.aspx
答案 3 :(得分:0)
日期时间比较没有进入,比较时一切都是VARCHAR。
尝试:
SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, keyedtimestamp)) as KeyedDate
FROM TMSSTATFILE_STATS a
WHERE DATEADD(dd, 0, DATEDIFF(dd, 0, keyedtimestamp)) BETWEEN '03/01/2011' AND '03/31/2011'
ORDER BY DATEADD(dd, 0, DATEDIFF(dd, 0, keyedtimestamp))