我正在查询一个包含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月的第2个星期六重置/“滚动”,因此,例如最近的滚动日期是2016年7月9日星期六。点击查看-rollover year date ranges
我的上述情况声明不再适用,因为我不能只添加“datepart(month,oline.order_date_ready)=7”-我不需要整个7月,我只需要7月第2个星期六之后的所有订单。因此在本例中,我需要将从2016年7月9日星期六到今天发生的所有事情标记为rollover_date=2016。
有没有灵活的方法来做到这一点而不用硬编码以前/未来翻滚日期到另一个表?这是我目前唯一能想到的解决办法,但我相信一定有更好的办法。
谢谢!

最佳答案

如果你要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
;

因此,如果从d年起的任何日期y,如果它在7月的第2个星期六之前,请将其指定为会计年度y - 1。否则给它财政年度(学年?)y

10-01 04:46