【问题标题】:WHERE date BETWEEN today and next 30 days not workingWHERE date BETWEEN 今天和接下来的 30 天不工作
【发布时间】:2022-01-15 08:21:37
【问题描述】:

我在提取 30 天内到期的记录时遇到了一些麻烦。我正在使用的数据库将日期存储在 char(10) 字段中,格式为 103(dd/mm/yyyy 或 10/12/2021)。我使用一个转换函数来使这个日期可用,但是当我尝试将它与一个 between 查询一起使用时它失败了:

WHERE 
    CONVERT(Date, SUBSTRING(TDate, 1, 10), 103) 
        BETWEEN DATEADD(DAY, 30, GETDATE()) AND GETDATE()

现在我怀疑它失败了,因为GETDATE() 默认格式为 yyyy-mm-dd-time,所以比较不起作用。我的问题是,如何将 GETDATE() 转换为格式 103 以获得正确的比较,或者将我的 TDate 字段转换为其他内容以使其正常工作?

【问题讨论】:

  • 定义“失败”。你有错误吗?警告?
  • 另一个很好的例子说明了您为什么要avoid BETWEEN for date/time calculations。这是原因之一——它不像看起来那么直观。不必重复 TDate 的表达式有更好的解决方案——一劳永逸地转换数据,或添加计算列,或在表顶部使用视图。所有这些也将消除其他人重新发明轮子的需要。
  • 没有错误@SalmanA,只是没有结果应该有。

标签: sql sql-server datetime intervals


【解决方案1】:

表达式x BETWEEN a AND bx >= a AND x <= b 相同。

现在GETDATE() + 30 总是大于GETDATE(),所以这个条件永远不会对任何值 为真——就像x >= (y + 30) and x <= y 不能对任何 x 和 y 为真。

那么我们还有另一个问题,您正在将日期与日期时间进行比较。如果日期是 2021-12-10 并且当前日期时间是 2021-12-10 12:00 PM,那么当您检查日期 >= 日期时间时,比较将返回 false。我推荐以下:

WHERE CONVERT(DATE, tdate, 103) >= CAST(GETDATE() AS DATE)
AND   CONVERT(DATE, tdate, 103) <= DATEADD(DAY, 29, CAST(GETDATE() AS DATE)) -- the range [0, 29] contains 30 days

【讨论】:

  • 这是完美的工作。我不能完全理解 CAST(GETDATE() AS DATE),本质上 GETDATE 应该是 DATE。无论如何,非常感谢!
  • 这是针对边缘情况的。 GETDATE 返回日期时间。因此,如果一行的 date = 2021-12-10 并且您想在当前日期时间为 2021-12-10 00:002021-12-10 23:59:59.999 或两者之间的任何时间时包含它,则需要进行强制转换才能获得预期的结果。
  • 谢谢。我还为此添加了以下内容,因为我注意到它忽略了我们过期的记录: OR CONVERT(DATE, TDate, 103)
猜你喜欢
  • 1970-01-01
  • 2016-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-21
  • 1970-01-01
  • 2015-01-19
相关资源
最近更新 更多