【问题标题】:Dynamic date in WHERE clause dependent on current dateWHERE 子句中的动态日期取决于当前日期
【发布时间】:2019-04-17 15:24:58
【问题描述】:

是否可以在 WHERE 子句中动态设置日期,以便如果当前日期 (GETDATE() ?) 小于当年的 7 月 1 日 (7/1) (当GETDATE() 运行时)然后将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.

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

【问题讨论】:

    标签: sql sql-server sql-server-2014


    【解决方案1】:

    一种不使用 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');
    

    【讨论】:

    • 所以这会动态地将年份值放入字符串中?所以假设如果 GETDATE() 返回 '2019-04-17' (小于今年的 7/1),那么它将返回 2018 年?如果 GETDATE() 返回当前日期“2019-07-02”,那么它将返回 2019 年?
    • 是的,完全正确。自己试试吧!
    猜你喜欢
    • 1970-01-01
    • 2020-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-17
    相关资源
    最近更新 更多