首页 > 解决方案 > WHERE 子句中的动态日期取决于当前日期

问题描述

是否可以使WHERE子句中的日期成为动态的,以便如果当前日期(GETDATE()?)小于当年(何时GETDATE()运行)的 7 月 1 日(7/1),则使WHERE子句中的日期为 7/ 1一年。如果当前日期大于当年的 7/1,则使WHERE子句中的日期为当年的 7/1 。这里有一些例子。

   --EXAMPLE 1:
        GETDATE() = 4/17/19

        SELECT A.DATE
        FROM TEST_TABLE A
        WHERE A.DATE >'2018-07-01'  <-- This would be dynamic based on the current date being less than 7/1 of this year, so use previous year.

   --EXAMPLE 2:

       GETDATE() = 7/2/19

       SELECT A.DATE
       FROM TEST_TABLE A
       WHERE A.DATE > '2019-07-01' <-- 2019 Because current date is greater than 7/1 of current year we use the current year.

我将在视图中使用它,所以我不相信我可以声明和使用变量,所以我正在寻找其他选项。

标签: sqlsql-serversql-server-2014

解决方案


一种没有 case/else 语句的方法:

CONCAT(Year(DATEADD(month, -6, GETDATE())), '/07/01')

这会从当前日期 ( DATEADD(month, -6, GETDATE())) 中减去 6 个月,只取新日期的年份 ( Year(...)) 并附/07/01加到末尾 ( CONCAT(..., '/07/01'))。

例子:

SELECT CONCAT(Year(DATEADD(month, -6, '2017/06/30')), '/07/01'); 输出 2016/07/01

SELECT CONCAT(Year(DATEADD(month, -6, '2017/07/01')), '/07/01');输出2017/07/01

在上下文中使用:

SELECT A.DATE
       FROM TEST_TABLE A
       WHERE A.DATE > CONCAT(Year(DATEADD(month, -6, GETDATE())), '/07/01');

推荐阅读