【问题标题】:Dealing with SQL server datetime edge cases处理 SQL Server 日期时间边缘情况
【发布时间】:2012-05-14 15:50:27
【问题描述】:

我在 SQL Server 2000 表中有以下数据:

Dates
-----------------------
2012-05-04 01:23:45.678
2012-05-05 01:23:45.678
2012-05-06 01:23:45.678

假设GETDATE()返回:

2012-05-05 12:34:56.789

我需要从上面返回第 2 行和第 3 行的最有效(和优雅)的查询,条件是:

Dates 的日期部分 >= GETDATE()

的日期部分

【问题讨论】:

  • @Oded: WHERE CONVERT( VARCHAR, Dates, 101 ) >= GETDATE( ) - 1 (i) 它不使用任何索引 (ii) 当 GETDATE() 的时间部分正好是 00:00:00 时,它在边缘情况下失败。
  • 首先在局部变量中“缓存”GETDATE()(或您需要的确切值 - 不包括时间部分)。
  • 而您只需要将整个日期与当前日期进行比较即可获得该值。转换为 VARCHAR 会杀死索引 - 它不是 sargable。
  • @Oded:我将其转换为 varchar 以消除时间部分(这是我知道的唯一方法)。

标签: sql-server tsql datetime sql-server-2000


【解决方案1】:
DECLARE @Now DATETIME
SELECT @Now = DATEADD(dd, DATEDIFF(dd, 0, GETDATE()), 0)

SELECT ...
WHERE Dates >= @Now 

改编自thisthis

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-10
    • 1970-01-01
    • 1970-01-01
    • 2020-09-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多