Snowflake 中的四分之一函数
Quarter function in Snowflake
我已经为 SAP HANA 中的四分之一函数编写了“select”查询。
select QUARTER (CURRENT_DATE, 8) FROM DUMMY;
output: 2021-Q3
有人可以帮我解决 Snowflake 中的等效查询吗?
试试这些:
SELECT DATE_TRUNC('QUARTER', CURRENT_TIMESTAMP())
, QUARTER(CURRENT_TIMESTAMP())
, YEAR(CURRENT_TIMESTAMP()) || '-Q' || QUARTER(CURRENT_TIMESTAMP());
目标是处理指示财政年度开始月份的第二个参数。
QUARTER (d, [, start_month ])
对于当前日期 (2022-02-06),输出不应为 2022-Q1
,而应为 2021-Q3
。
可以通过一些日期计算来实现:
- 第一部分是处理年份(current/previous)
- 第二部分是根据开始月份调整的计算季度
查询:
SET FirstMonth = 8;
SELECT YEAR(d) - IFF(d >= DATEFROMPARTS(YEAR(d),$FirstMonth,1), 0, 1)
|| '-Q' || QUARTER(DATEADD(month, -$FirstMonth+1, d)) AS output
FROM (SELECT CURRENT_DATE() AS d) AS sub;
输出:2021-Q3
正如 Lukasz 指出的那样,第二个参数是 start_month SAP doc's
所以这实际上是两部分,要知道关于偏移量的 year-quarter 是什么,您只需要从您拥有的 date
中减去 offset month
和然后 year
和 quarter
调整后的日期。并格式化 STRING
后面的一点似乎无法用 TO_CHAR 格式命令来完成。否则它会非常好。所以现在我们必须坚持 YEAR(adj_date) || '-Q' || QUARTER(adj_date)
.
啰嗦解释SQL:
SELECT
8 as first_month_of_fin_year
,first_month_of_fin_year - 1 as month_adj
,to_date(column1,'yyyy-mm') as in_date
,dateadd(month,-month_adj, in_date) as adj_date
,year(adj_date) as y
,quarter(adj_date) as q
,y::text || '-Q' || q::text as answer
FROM VALUES
('2021-06'),
('2021-07'),
('2021-08'),
('2021-09'),
('2021-10'),
('2021-11'),
('2021-12'),
('2022-01'),
('2022-02'),
('2022-03'),
('2022-04'),
('2022-05'),
('2022-06'),
('2022-07'),
('2022-08'),
('2022-09'),
('2022-10')
ORDER BY 1;
给出:
FIRST_MONTH_OF_FIN_YEAR
MONTH_ADJ
IN_DATE
ADJ_DATE
Y
Q
ANSWER
8
7
2021-06-01
2020-11-01
2020
4
2020-Q4
8
7
2021-07-01
2020-12-01
2020
4
2020-Q4
8
7
2021-08-01
2021-01-01
2021
1
2021-Q1
8
7
2021-09-01
2021-02-01
2021
1
2021-Q1
8
7
2021-10-01
2021-03-01
2021
1
2021-Q1
8
7
2021-11-01
2021-04-01
2021
2
2021-Q2
8
7
2021-12-01
2021-05-01
2021
2
2021-Q2
8
7
2022-01-01
2021-06-01
2021
2
2021-Q2
8
7
2022-02-01
2021-07-01
2021
3
2021-Q3
8
7
2022-03-01
2021-08-01
2021
3
2021-Q3
8
7
2022-04-01
2021-09-01
2021
3
2021-Q3
8
7
2022-05-01
2021-10-01
2021
4
2021-Q4
8
7
2022-06-01
2021-11-01
2021
4
2021-Q4
8
7
2022-07-01
2021-12-01
2021
4
2021-Q4
8
7
2022-08-01
2022-01-01
2022
1
2022-Q1
8
7
2022-09-01
2022-02-01
2022
1
2022-Q1
8
7
2022-10-01
2022-03-01
2022
1
2022-Q1
更小SQL
因此,一旦我们看到我们遵循的步骤如下,就可以编写 smaller/compact SQL:
SELECT
8 as start_month
,to_date(column1,'yyyy-mm') as in_date
,year(dateadd(month,-(start_month - 1), in_date)) || '-Q'
|| quarter(dateadd(month,-(start_month - 1), in_date)) as answer
FROM ...
或者如果你知道你只想要 8 个,并且 current_date
SELECT
year(dateadd(month,-7, current_date)) || '-Q'
|| quarter(dateadd(month,-7, current_date)) as answer
;
我已经为 SAP HANA 中的四分之一函数编写了“select”查询。
select QUARTER (CURRENT_DATE, 8) FROM DUMMY;
output: 2021-Q3
有人可以帮我解决 Snowflake 中的等效查询吗?
试试这些:
SELECT DATE_TRUNC('QUARTER', CURRENT_TIMESTAMP())
, QUARTER(CURRENT_TIMESTAMP())
, YEAR(CURRENT_TIMESTAMP()) || '-Q' || QUARTER(CURRENT_TIMESTAMP());
目标是处理指示财政年度开始月份的第二个参数。
QUARTER (d, [, start_month ])
对于当前日期 (2022-02-06),输出不应为 2022-Q1
,而应为 2021-Q3
。
可以通过一些日期计算来实现:
- 第一部分是处理年份(current/previous)
- 第二部分是根据开始月份调整的计算季度
查询:
SET FirstMonth = 8;
SELECT YEAR(d) - IFF(d >= DATEFROMPARTS(YEAR(d),$FirstMonth,1), 0, 1)
|| '-Q' || QUARTER(DATEADD(month, -$FirstMonth+1, d)) AS output
FROM (SELECT CURRENT_DATE() AS d) AS sub;
输出:2021-Q3
正如 Lukasz 指出的那样,第二个参数是 start_month SAP doc's
所以这实际上是两部分,要知道关于偏移量的 year-quarter 是什么,您只需要从您拥有的 date
中减去 offset month
和然后 year
和 quarter
调整后的日期。并格式化 STRING
后面的一点似乎无法用 TO_CHAR 格式命令来完成。否则它会非常好。所以现在我们必须坚持 YEAR(adj_date) || '-Q' || QUARTER(adj_date)
.
啰嗦解释SQL:
SELECT
8 as first_month_of_fin_year
,first_month_of_fin_year - 1 as month_adj
,to_date(column1,'yyyy-mm') as in_date
,dateadd(month,-month_adj, in_date) as adj_date
,year(adj_date) as y
,quarter(adj_date) as q
,y::text || '-Q' || q::text as answer
FROM VALUES
('2021-06'),
('2021-07'),
('2021-08'),
('2021-09'),
('2021-10'),
('2021-11'),
('2021-12'),
('2022-01'),
('2022-02'),
('2022-03'),
('2022-04'),
('2022-05'),
('2022-06'),
('2022-07'),
('2022-08'),
('2022-09'),
('2022-10')
ORDER BY 1;
给出:
FIRST_MONTH_OF_FIN_YEAR | MONTH_ADJ | IN_DATE | ADJ_DATE | Y | Q | ANSWER |
---|---|---|---|---|---|---|
8 | 7 | 2021-06-01 | 2020-11-01 | 2020 | 4 | 2020-Q4 |
8 | 7 | 2021-07-01 | 2020-12-01 | 2020 | 4 | 2020-Q4 |
8 | 7 | 2021-08-01 | 2021-01-01 | 2021 | 1 | 2021-Q1 |
8 | 7 | 2021-09-01 | 2021-02-01 | 2021 | 1 | 2021-Q1 |
8 | 7 | 2021-10-01 | 2021-03-01 | 2021 | 1 | 2021-Q1 |
8 | 7 | 2021-11-01 | 2021-04-01 | 2021 | 2 | 2021-Q2 |
8 | 7 | 2021-12-01 | 2021-05-01 | 2021 | 2 | 2021-Q2 |
8 | 7 | 2022-01-01 | 2021-06-01 | 2021 | 2 | 2021-Q2 |
8 | 7 | 2022-02-01 | 2021-07-01 | 2021 | 3 | 2021-Q3 |
8 | 7 | 2022-03-01 | 2021-08-01 | 2021 | 3 | 2021-Q3 |
8 | 7 | 2022-04-01 | 2021-09-01 | 2021 | 3 | 2021-Q3 |
8 | 7 | 2022-05-01 | 2021-10-01 | 2021 | 4 | 2021-Q4 |
8 | 7 | 2022-06-01 | 2021-11-01 | 2021 | 4 | 2021-Q4 |
8 | 7 | 2022-07-01 | 2021-12-01 | 2021 | 4 | 2021-Q4 |
8 | 7 | 2022-08-01 | 2022-01-01 | 2022 | 1 | 2022-Q1 |
8 | 7 | 2022-09-01 | 2022-02-01 | 2022 | 1 | 2022-Q1 |
8 | 7 | 2022-10-01 | 2022-03-01 | 2022 | 1 | 2022-Q1 |
更小SQL
因此,一旦我们看到我们遵循的步骤如下,就可以编写 smaller/compact SQL:
SELECT
8 as start_month
,to_date(column1,'yyyy-mm') as in_date
,year(dateadd(month,-(start_month - 1), in_date)) || '-Q'
|| quarter(dateadd(month,-(start_month - 1), in_date)) as answer
FROM ...
或者如果你知道你只想要 8 个,并且 current_date
SELECT
year(dateadd(month,-7, current_date)) || '-Q'
|| quarter(dateadd(month,-7, current_date)) as answer
;