2

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

它现在提供日期为 2011 年 3 月 1 日至 2011 年 3 月 31 日的数据

KeyedTimestamp 字段是 DateTime,并且有与这些记录相关联的时间。2011 年 3 月 31 日的所有记录均已计算在内。我知道我可以通过在中间的第二个日期提供最大时间来做到这一点,所以我不是在寻找替代 where 子句,而是理解为什么它忽略第一个记录,即使它合并了这些记录从 31 日起。

几乎就像它检查 2011 年 3 月 1 日 23:59:59,我希望我可以消除这种我只关心日期而不是时间的检查

4

4 回答 4

9

通过不使用 BETWEEN 来避免列上的函数。一个函数意味着永远不会使用任何索引

WHERE
    a.KeyedTimestamp >= '20110301' AND a.KeyedTimestamp < '20110401'  

SQL Server 2008 之前的 yyyymmdd是唯一安全的日期格式。

于 2011-05-09T16:59:06.803 回答
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 值中剥离时间值。

于 2011-05-09T16:57:31.773 回答
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

于 2011-05-09T16:52:18.293 回答
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))
于 2011-05-09T16:52:34.540 回答