【问题标题】:Calculate the amount of time between two dates and return a true/false if it's been over/under X amount of years计算两个日期之间的时间量,如果超过/低于 X 年,则返回真/假
【发布时间】:2021-01-28 01:16:37
【问题描述】:

我想创建一个查询,它将获取一个字段(日期时间)并将其与当前时间进行比较(使用GETDATE())。如果从该字段到今天已经 10 年,则返回 true,否则返回 false。

我尝试使用DATEDIFF() 函数,但它似乎没有考虑月/日。有人有什么建议吗?

【问题讨论】:

  • 请向我们展示您的尝试。
  • 显示样本数据和所需结果。 DATEDIFF 依赖于日期边界,而不是时间流逝。您预计 2010 年 1 月 1 日的结果是什么? 2010 年 12 月 31 日怎么样? 2010 年 10 月 12 日、13 日或 14 日怎么样?你想把 365 天算作一年吗?闰年呢?请具体。

标签: sql sql-server database datetime


【解决方案1】:

SQL Server 并没有真正的“真”和“假”。我会使用10

select (case when field < dateadd(year, -10, getdate()) then 1 else 0 end) as flag_10yr

请注意,这会直接比较日期而不是 datediff()。该函数计算两年之间的边界数,这不是一回事——根据此函数,2019-12-31 和 2020-01-01 “相隔 1 年”。

【讨论】:

    【解决方案2】:

    如果 datepart 参数设置为“年份”,Datediff 应该可以完成这项工作。

    declare @field      datetime='2001-01-01';
    
    select case when datediff(year, @field, getdate())>=10 then 'True' else 'False' end;
    

    输出

    True
    

    [编辑] 或者,如果您喜欢 datetime 和 GETDATE 之间的实际 365 天数,您可以使用 datepart 'day' 并除以 365。

    查询

    select case when datediff(day, @field, getdate())/365>=10 then 'True' else 'False' end
    

    输出

    True
    

    【讨论】:

    • Datediff 不是一个准确的建议,因为它计算了边界。 2020 年 1 月 1 日至 2019 年 12 月 31 日之间的 Datediff(以年为单位)仍然为 1,因为它跨越了一年的边界——而大多数人会说这是错误的。此外,在列上使用函数将阻止优化器在用作过滤器时考虑包含该列的任何有用索引(即,过滤器将不是 sargable)。由于这些原因,Gordon 的方法是首选。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-04
    • 2012-01-06
    • 2020-02-02
    • 2012-01-31
    相关资源
    最近更新 更多