Oracle SQL中的Business Week逻辑

时间:2015-01-07 16:34:18

标签: sql oracle oracle-sqldeveloper

如果一周超过6个星期前,我正在使用以下Oracle SQL查询。

,CASE 
WHEN to_char(next_day(CURRENT_TIMESTAMP,'sunday'),'iw')-6 <= to_char(next_day(m.COMPLETED_DT,'sunday'),'iw') THEN 'Yes'
ELSE 'No' END AS "Completed.Prior 6 Weeks"

问题是这个陈述没有考虑到这一年,所以现在是2015年,商业周是1,上一年的一切都有更大的商业周。

我有些人需要考虑这一年,比如下面的作品,但不考虑商业周刊。

CURRENT_TIMESTAMP -42 >= m.COMPLETED_DT

任何帮助非常感谢

1 个答案:

答案 0 :(得分:1)

不是使用TO_CHAR()来获取营业周(我认为这意味着周一从周一开始),您应该使用TRUNC() - 这样就可以保留年份:

, CASE WHEN TRUNC(NEXT_DAY(SYSDATE, 'sunday'), 'iw') - 42 >= 
            TRUNC(NEXT_DAY(m.COMPLETED_DT, 'sunday'), 'iw') THEN 'Yes'
  ELSE 'No' END AS "Completed.Prior 6 Weeks"

请注意,我使用了42而不是6,因为Oracle日期算术使用了几天。

我不确定使用CURRENT_TIMESTAMP优于SYSDATE是否有优势。如果你想使用ANSI标准,你需要CURRENT_DATE ...我认为你不需要CURRENT_TIMESTAMP的粒度,特别是因为你要截断它。此外,当我认为您的意思是<=时,您已经>=了(根据您在问题后面的内容)。