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 和然后 yearquarter 调整后的日期。并格式化 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
;