Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL-检查订单日期是否在7月的第二个星期六之后_Sql_Postgresql_Date_Calendar_Amazon Redshift - Fatal编程技术网

SQL-检查订单日期是否在7月的第二个星期六之后

SQL-检查订单日期是否在7月的第二个星期六之后,sql,postgresql,date,calendar,amazon-redshift,Sql,Postgresql,Date,Calendar,Amazon Redshift,我正在查询一个包含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

我正在查询一个包含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日星期六。单击此处可查看-

我上面的案例陈述不再适用,因为我不能只添加“datepart(month,oline.order_date_ready)=7”-我不需要整个7月,我只需要7月第二个星期六之后发生的所有订单。所以在这个例子中,我需要将从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
;

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

你可以用
date
算法简化你的查询,比如
make\u date(y,7,14)-提取(DOW FROM make\u date(y,7,1))::int