【问题标题】:How to retrieve all records from a set day and set month, but a variable year?如何从设定的日期和设定的月份中检索所有记录,但年份是可变的?
【发布时间】:2019-09-07 18:18:18
【问题描述】:

我需要在设定的日期和设定的月份之后检索所有记录,但年份是可变的。 IE:我需要检索 10 月 1 日之后的所有记录,向后延伸 3 年。

更好的例子:在 2019 年,我需要检索自 2016 年 10 月 1 日以来的所有记录。在 2020 年,我需要检索自 2017 年 10 月 1 日以来的所有记录。

我可以硬编码日期,但我宁愿但不必每年更新代码。

我一直在为我的 WHERE 子句执行此操作,但它显然不会像我需要的那样过滤掉 2016 年 10 月 1 日之前的记录: WHERE Date > DATEADD(year, -3, GETDATE());

【问题讨论】:

  • 试试SELECT DateAdd(yy, -3, GetDate())
  • 月份和日期是否总是 10 月 1 日?因此,对于今天,即使我们还没有到 10 月,您是否想要所有值超过 2016100120191001 - 3 年)的行?
  • WHERE Date > cast('10/01/'+ cast((datepart(year,getdate())-3) as varchar(5)) as date)
  • 日期永远是 10 月 1 日,是的。我只需要从当前日期到 10 月 1 日(当前年份 - 3 年)的所有记录。

标签: sql sql-server tsql


【解决方案1】:

假设版本 2012 或更高版本,您可以使用datefromparts

SELECT ...
FROM TableName
WHERE DateColumn >= DATEFROMPARTS(YEAR(GETDATE())-3, 10, 1);

对于旧版本,您可以手动构建日期:

SELECT ...
FROM TableName
WHERE DateColumn >= CAST((CAST(YEAR(GETDATE())-3 as char(4)) + '-10-01') as date);

【讨论】:

  • 谢谢!我使用 DATEFROMPARTS 解决方案修改了我的查询,它产生了我所需要的。
  • 很高兴为您提供帮助 :-)
【解决方案2】:

假设对于给定年份的任何日期,您希望从 3 年前开始到 10 月(因此对于 2019 年 1 月 1 日和 2019 年 12 月 31 日,您都希望 2016 年 10 月 1 日),那么您可以这样做:

SELECT ...
FROM ...
WHERE YourDateColumn >= DATEFROMPARTS(DATEPART(YEAR, GETDATE())-3,10,1)
  AND YourDateColumn <= GETDATE()
  ...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-23
    • 2023-03-05
    • 1970-01-01
    • 2012-02-17
    相关资源
    最近更新 更多