0

我正在尝试在 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(当前的日期));

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

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

4

1 回答 1

1

这可以使用DATE_ADD(…)和特定用途的DATE_TRUNC(…)日期/时间函数来简化。ADD_MONTHS(…)

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

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 |
+----------------+------------------+------------+------------+------------+------------+
于 2020-06-23T23:05:55.340 回答