【问题标题】:Get data for past three years starting from January从 1 月开始获取过去三年的数据
【发布时间】:2022-01-05 16:54:11
【问题描述】:

我正在编写一个查询,我需要在其中获取过去三年的数据。我想要捕捉的是从一月到现在的过去三年。随着时间的推移,这需要动态添加几个月到 2022 年,同时保留 2019 年的整个历史记录。

不幸的是,我的显示从今天开始三年的历史(36 个月,从 2019 年 1 月下降。

查询:

WHERE PDBC.PDBC_EFF_DT >= DATEADD(YEAR,-3,GETDATE())

WHERE PDBC.PDBC_EFF_DT >= '01/01/2019'

有效,但不想在今年之后更新 年份,因为它嵌入在 excel 中。

输出:

https://i.stack.imgur.com/kC0G8.png

需要:

2019 年 1 月至今,最短日期更改为明年 2020 年 1 月。

修复:

感谢大家的意见,从你们的每个 cmet 中学到了一点,我想大概是这样......

WHERE 
YEAR(PDBC.PDBC_EFF_DT) BETWEEN YEAR(GETDATE()) - 3 AND YEAR(GETDATE())

【问题讨论】:

  • 如果您包含完整的查询,我可以给出正确的答案 - 但如果您使用变量来表示今年一月的第一天(而不是 GETDATE()),那么会有帮助的。
  • datefromparts(year(getdate()) - 3, 1, 1) 将为您提供“三年前的 1 月 1 日”。即,如果您在 2022 年的任何一天执行此操作,它将给出 2019-01-01
  • 想一想,GETDATE() 返回 当前 日期和时间。所以,现在它会返回一个类似于2022-01-05 17:20:37.423 (UTC) 的值。如果从中减去 3 年,您将得到 2019-01-05 17:20:37.423;您缺少 4 天 ~17 小时的数据。#
  • 要求不明确。 capture is the past three years (Jan - Dec) 但您现有的 WHERE 子句只说 >=。那么你只想要 2019 年、2020 年和 2021 年的数据吗?还是从 2019 年 1 月 1 日到现在的所有数据?如果是前者,那么您什么时候转移到 2020 年、2021 年和 2022 年?

标签: sql sql-server database


【解决方案1】:

上面的评论显示了确定起点的正确方法:

DECLARE @start datetime 
        = DATEFROMPARTS(DATEPART(YEAR, GETDATE()) - 3, 1, 1);

根据此时间范围查询表中数据的正确方法 - 以确保您可能在日期时间列上使用任何现有或未来的索引 - 使用范围谓词:

WHERE date_eff_dt >= @start

要求不清楚,但如果您只想要这三年内的数据,并且今年没有发生任何事情,只需添加一个结束界限:

  AND date_eff_dt < DATEADD(YEAR, 3, @start)

或者你可以反过来:

DECLARE @end datetime
        = DATEFROMPARTS(DATEPART(YEAR, GETDATE()), 1, 1);

SELECT 
  ...
WHERE date_eff_dt >= DATEADD(YEAR, -3, @end)
  AND date_eff_dt <  @end;

【讨论】:

    【解决方案2】:

    如果您要查找 3 年前之后的所有数据,则较早的答案应该有效。我可能会误解您的问题,但我相信您正在寻找 3 个完整日历年的数据。我会使用以下模式:

    WHERE YEAR(date_eff_dt) BETWEEN YEAR(GETDATE()) - 3 AND YEAR(GETDATE()) - 1
    

    【讨论】:

    • 同样对列应用YEAR() 会使索引失效。为什么不&gt;= Jan 1 2019 AND &lt; Jan 1 2022
    【解决方案3】:

    尝试在过滤器中比较年份:

    where DatePart(Year,date_eff_dt) >=DatePart(Year,GetDate())-3
    

    【讨论】:

    • 让我折射它 DatePart(Year,GetDate())-3。超级容易修复
    • Point 仍然位于 DatePart(Year,date_eff_dt) &gt;= 附近 - 这只是确保您每次都扫描整个表的一种方式。
    • 是的。它将扫描整个表。您只能使用年份填充字段,然后查看解释计划是否会优化。非聚集索引可以应用于年份
    • ...或者只是索引可能已经存在的日期时间列。
    猜你喜欢
    • 2022-07-07
    • 1970-01-01
    • 1970-01-01
    • 2012-02-13
    • 1970-01-01
    • 2017-01-01
    • 2017-12-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多