【问题标题】:SQL - check if an order date occurs after the second Saturday in JulySQL - 检查订单日期是否在 7 月的第二个星期六之后
【发布时间】:2017-06-04 17:14:52
【问题描述】:

我正在查询一个包含 4 年订单交易的表(pk = 订单号),并且我希望根据订单日期用特定日期标志标记每条记录 - 例如,日历年、日历月、财政年度等。我遇到了一些特定于我们业务的日期属性(例如,不容易通过 datepart 函数解决)。

我能够使用案例语句添加“学年”(对于我们来说,运行 8 月 1 日至 7 月 31 日):

case
when datepart(month, oline.order_date_ready) between 8 and 12 then datepart(year, oline.order_date_ready)
else (datepart(year, oline.order_date_ready)-1)
end as school_yr

因此对于 2017 年 1 月 19 日,上述内容将返回“2016”,因为对我们而言,2016 学年从 2016 年 8 月 1 日到 2017 年 7 月 31 日。

但现在我无法为称为“展期年”的事物重复相同类型的案例陈述。我们所有的订单历史记录表都会在每个日历年 7 月的第二个星期六重置/“展期”,例如最近的展期日期是 2016 年 7 月 9 日星期六。点击查看 - rollover year date ranges

我的上述案例陈述不再适用,因为我不能只添加“datepart(month, oline.order_date_ready) = 7” - 我不需要整个 7 月,我只需要发生的所有订单在那个七月的第二个星期六之后。所以在这个例子中,我需要从 2016 年 7 月 9 日星期六到今天发生的所有事情都被标记为 rollover_date = 2016。

是否有一种灵活的方法可以做到这一点,而无需将之前/未来的转存日期硬编码到另一个表中?这是我目前能想到的解决它的唯一方法,但我相信一定有更好的方法。

谢谢!

【问题讨论】:

    标签: sql postgresql date calendar amazon-redshift


    【解决方案1】:

    如果您要求 7 月 1 日是星期几,那么从那里算术是简单的,对吗?此查询提供与您的图像匹配的结果:

    SELECT  y,
            CONCAT(y, '-07-01')::timestamp +
              CONCAT(6 - EXTRACT(DOW FROM CONCAT(y, '-07-01')::timestamp) + 7, ' days')::interval
    FROM    generate_series(2013, 2020) s(y)
    ORDER BY y DESC
    ;
    

    因此,给定从 y 年开始的任何日期 d,如果它在 7 月的第二个星期六之前,则给出财政年度 y - 1。否则给它财政年度(学年?)y

    【讨论】:

    • 您可以使用date 算法简化查询,例如make_date(y, 7, 14) - EXTRACT(DOW FROM make_date(y, 7, 1))::int
    猜你喜欢
    • 2018-07-15
    • 1970-01-01
    • 2016-06-29
    • 2021-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-06
    相关资源
    最近更新 更多