【问题标题】:Last day of most recent financial quarter in Snowflake雪花最近一个财政季度的最后一天
【发布时间】:2022-01-19 21:30:14
【问题描述】:

有没有一种简单的方法可以返回 Snowflake 中最近一个季度的最后一天?

我们使用最后几天的财务季度:1 月 31 日、4 月 30 日、7 月 31 日、10 月 31 日

谢谢!

【问题讨论】:

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


    【解决方案1】:

    不确定您想要当前季度的最后一天还是上一季度的最后一天,但这应该足以到达您想去的地方:

    SELECT current_date today,
        date_trunc('quarter', today) as cur_qrt,
        dateadd('day', -1, cur_qrt) as last_day_of_prior_qrt,
        dateadd('day', -1, dateadd('quarter', 1, cur_qrt)) as last_day_of_current_qrt;
    
    TODAY CUR_QRT LAST_DAY_OF_PRIOR_QRT LAST_DAY_OF_CURRENT_QRT
    2022-01-19 2022-01-01 2021-12-31 2022-03-31

    因此任何day 的上一季度最后一天是:

    dateadd('day', -1, date_trunc('quarter', DAY)) as last_day_of_prior_qrt,
    

    嗯,你是如何提出这个问题的,我看不出你的约会是你想要的。但如果是这样,那就太好了。

    SELECT 
        to_date(column1) as day,
        IFF( extract(month, day) in (1, 4, 7, 10),
            add_months(dateadd('day', -1, date_trunc('quarter', day)), -2),
            add_months(dateadd('day', -1, date_trunc('quarter', day)), 1) 
        ) as last_day_of_prior_qrt,
        date_trunc('quarter', day) as cur_qrt,
        dateadd('day', -1, date_trunc('quarter', day)) as sim_sqt
     from values 
        ('2021-01-04'),('2021-02-04'),('2021-03-04'),('2021-04-04'),('2021-05-04'),('2021-06-04'),('2021-07-04'),('2021-08-04');
    

    给予:

    DAY LAST_DAY_OF_PRIOR_QRT CUR_QRT SIM_SQT
    2021-01-04 2020-10-31 2021-01-01 2020-12-31
    2021-02-04 2021-01-31 2021-01-01 2020-12-31
    2021-03-04 2021-01-31 2021-01-01 2020-12-31
    2021-04-04 2021-01-31 2021-04-01 2021-03-31
    2021-05-04 2021-04-30 2021-04-01 2021-03-31
    2021-06-04 2021-04-30 2021-04-01 2021-03-31
    2021-07-04 2021-04-30 2021-07-01 2021-06-30
    2021-08-04 2021-07-31 2021-07-01 2021-06-30

    鉴于 2021 年 1 月 4 日是在 2021 年第一季度,我看不到“前”季度 id 2020 年第三季度,因此最后一天是 2020-10-31,但如果那是你想要的结果的话..

    【讨论】:

    • 谢谢!寻找上一季度的最后一天。我将看看是否可以修改它以适应以下财政季度结束日期:1 月 31 日、4 月 30 日、7 月 31 日、10 月 31 日
    • 这个轻微的修改返回了我需要的结果。再次感谢您的帮助。 SELECT CASE WHEN extract(month, current_date()) in (1, 4, 7, 10) THEN add_months(dateadd('day', -1, date_trunc('quarter', current_date())), -2) ELSE add_months(dateadd('day', -1, date_trunc('quarter', current_date())), 1) end as last_day_of_prior_qrt
    • @tennis_fan89 我又做了一次更新,将CASE WHEN 换成了IFF,但你的结果让我觉得很奇怪。
    • 我知道,这有点令人困惑,但这是我需要的结果。该客户以这种方式设置其财政季度。将 CASE WHEN 换成 IFF 的原因是什么?性能改进?
    • @tennis_fan89 原因IFF“较小的代码”如果您使用只有 2 个分支(WHEN/ELSE)的 CASE 编写 SQL 并且存在编译错误,它们是“相同的代码”,该消息在 IFF 中返回错误,因此 SQL 编译器将其视为“相同”。有一个论点“使用 ANSI SQL”,但我不相信,我相信你应该使用最明确的最小代码。这就是为什么我不喜欢查询中的隐式类型转换,“是不是故意的”或“是不是错字”。
    猜你喜欢
    • 2020-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-10
    • 1970-01-01
    • 1970-01-01
    • 2019-09-30
    • 2010-09-23
    相关资源
    最近更新 更多