【问题标题】:SQL Server : GETDATE with Between function doesnt return the desired dataSQL Server:带有Between函数的GETDATE不返回所需的数据
【发布时间】:2021-05-30 05:57:25
【问题描述】:

如果日期在StartDate AND EndDate 之间,我会尝试在页面上显示横幅

SELECT * 
FROM TABLE 
WHERE GETDATE() BETWEEN StartDate AND EndDate)

如果我使用GETDATE() 也无法获得 ID 为 3 的记录,因为我的时间值始终是 00:00:00.000,所以我的时间值始终是 00:00:00.000数据库列,以便上面的查询将显示所有三个记录

 ID  StartDate                  EndDate
-------------------------------------------------------
  1  2020-12-31 00:00:00.000    2021-03-15 00:00:00.000
  2  2020-12-31 00:00:00.000    2021-03-31 00:00:00.000
  3  2021-01-01 00:00:00.000    2021-02-28 00:00:00.000

我也使用下面的查询,但它显示了相同的结果集。

SELECT * 
FROM TABLE 
WHERE (GETDATE() BETWEEN StartDate AND CONVERT(varchar, EndDate, 23))

将数据类型更改为仅存储日期部分可以解决问题,但我无法更改数据库

【问题讨论】:

  • CONVERT(varchar, EndDate, 23)) 现在你肯定知道这是一个坏习惯和懒惰的编码。始终为可变长度数据类型指定适当的长度。
  • @Smor 将日期转换为 varchar 以去除时间部分也很懒
  • @Charlieface 是的,两者兼而有之,但我们并不总是拥有一张设计合理的桌子。
  • @SMor 什么,我不是这么说的。 OP 已经有date 列,为什么要将它们转换为varchar 以节省时间,请改用cast(... as date)

标签: sql sql-server date between


【解决方案1】:

如果您想忽略时间,请在GETDATE()

WHERE CONVERT(DATE, GETDATE()) BETWEEN StartDate AND EndDate

或在EndDate 中添加一天并使用:

WHERE GETDATE() >= StartDate AND
      GETDATE() < DATEADD(DAY, 1, EndDate)

【讨论】:

  • 后一个子句,DATEADD(DAY, 1, EndDate) 不会是 SARGable,所以我建议反对这个解决方案。
  • @Larnu 。 . .整个表达式是不可分割的。我的意思是,可以在其中一列上使用索引,但这对于此类任务可能没有什么好处——而且startDate 上的索引仍然可以使用。
  • 是的,WHERE GETDATE() &gt;= StartDate AND CAST(CAST(GETDATE() AS date) AS datetime) &lt;= EndDate 可以正常工作。虽然我质疑为什么这两列都是datetime
  • 第一个解决方案 SARGable,戈登。
  • Sargable - 是的 - 但是 might not be a good idea.
【解决方案2】:

要保持查询 sarge-able(能够使用索引),请将 GETDATE 转换为您想要的方式,而不是转换列。

WHERE
    GETDATE() >= StartDate AND
    CAST(CAST(GETDATE() AS date) AS datetime) <= EndDate

【讨论】:

    【解决方案3】:
    SELECT * 
    FROM TABLE 
    WHERE CAST(GETDATE() AS DATE) BETWEEN StartDate AND EndDate
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多