【问题标题】:How can I specify 4 different start and end dates for previous year and current year all specifying the 1st day of the month using SET?如何为上一年和当年指定 4 个不同的开始和结束日期,都使用 SET 指定当月的第一天?
【发布时间】:2020-10-13 23:13:41
【问题描述】:

我正在尝试在 SnowSQL 中创建 SET 变量,这些变量将分别指定当前年份和前几年的每个开始月份和结束月份的第一个月。我希望代码能够随着时间的推移滚动到新的月份。例如,由于现在是 2020 年 6 月,我们将有 m2_start = 2020-06-01 和 m2_end = 2020-07-01。 m1_start = 2019-06-01 和 m1_end 2019-07-01。这是我到目前为止所拥有的,但我想要的并不安静,因为我不知道如何在月初指定:

SET m1_start = (SELECT DISTINCT DATEADD(year,-1,CURRENT_DATE) FROM DIMDATE d WHERE DAY(d."Date") = 1);

SET m1_end = (SELECT DISTINCT DATEADD(month, -11,CURRENT_DATE) FROM DIMDATE d WHERE DAY(d."Date") = 1);

SET m2_start = (SELECT d."Date" FROM DIMDATE d WHERE DAY(d."Date") = 1 AND MONTH(d."Date") = MONTH(CURRENT_DATE) AND YEAR(d."Date") = YEAR(CURRENT_DATE));

SET m2_end = (SELECT DISTINCT DATEADD(month, 1,CURRENT_DATE) FROM DIMDATE d WHERE DAY(d."Date") = 1);

SET 测试 = '2020-06-01';

【问题讨论】:

    标签: sql snowflake-cloud-data-platform snowsql


    【解决方案1】:

    这可以使用DATE_ADD(…)DATE_TRUNC(…)ADD_MONTHS(…) 特定用途的date/time functions 来简化。

    我不知道如何在月初指定:

    DATE_TRUNC(…) 函数可让您将任何日期缩短到其任何部分的开头。当使用month 部分运行时,它将产生一个等于月初的日期。

    一个最小的例子:

    SET _current_date = (SELECT CURRENT_DATE);
    SET _last_year_date = (SELECT DATEADD(year, -1, $_current_date));
    
    SET m2_start = (SELECT DATE_TRUNC(month, $_current_date));
    SET m2_end = (SELECT ADD_MONTHS($m2_start, 1));
    
    SET m1_start = (SELECT DATE_TRUNC(month, $_last_year_date));
    SET m1_end = (SELECT ADD_MONTHS($m1_start, 1));
    
    -- Alternatively, you can derive m1_* values by subtracting a year from m2_*
    -- values, but it felt too intermingled
    -- SET m1_start = (SELECT DATE_ADD(year, -1, $m2_start));
    -- SET m1_end = (SELECT DATE_ADD(year, -1, $m2_end));
    

    2020-06-24 上执行时的示例输出:

    > SELECT $_current_date, $_last_year_date, $m1_start, $m1_end, $m2_start, $m2_end;
    
    +----------------+------------------+------------+------------+------------+------------+
    | $_CURRENT_DATE | $_LAST_YEAR_DATE | $M1_START  | $M1_END    | $M2_START  | $M2_END    |
    |----------------+------------------+------------+------------+------------+------------|
    | 2020-06-23     | 2019-06-23       | 2019-06-01 | 2019-07-01 | 2020-06-01 | 2020-07-01 |
    +----------------+------------------+------------+------------+------------+------------+
    

    【讨论】:

    • 非常感谢柯比!您不仅提供了答案,而且还进行了解释。我非常感谢您的帮助!学习 SQL 和 DDL 的 7.5 个月让我有些吃惊。
    猜你喜欢
    • 2014-03-02
    • 1970-01-01
    • 1970-01-01
    • 2018-01-13
    • 2021-12-29
    • 1970-01-01
    • 2021-04-12
    • 1970-01-01
    • 2012-03-12
    相关资源
    最近更新 更多