如何在Oracle查询中确定一个季度的一周

时间:2016-06-17 22:00:26

标签: sql oracle

我想在Oracle的sql日期找到一季度

我在下面的查询中尝试查找年份,季度和星期。 但周字段给出了本月的一周'不是本季度的一周'

  

选择to_char(sysdate,' YYYY')|| ' -Q' || to_char(sysdate,' Q')|| ' -W' || > to_char(sysdate,' w')as"当前时间"   来自双重;

以上查询返回' 2016-Q2-W3'因为日期是在该月的第3周。

说sysdate是' 2016年6月17日' 我期待结果为

  

2016-Q2-的 W12

我的周范围是(周日 - 周六)

自2016年6月17日'在本季度的第12周,它应该是W12。

提前致谢。

1 个答案:

答案 0 :(得分:2)

这将是本季度的一周(周日至周六):

SELECT TO_CHAR( SYSDATE, 'YYYY-"Q"Q-"W"' )
     || ( 7 + TRUNC( SYSDATE + 1, 'IW' ) - TRUNC( TRUNC( SYSDATE, 'Q' ) + 1, 'IW' ) ) / 7;
         AS "Current Time"
FROM DUAL

<强>解释

  • 您可以使用NEXT_DAY( TRUNC( date_value ), 'SUNDAY' ) - 7(取决于NLS_TERRITORY设置)或TRUNC( date_value + 1, 'IW' ) - 1(更短)找到指定日期之前或之前的星期日并且不依赖于任何设置。)
  • TRUNC( date_value, 'Q' )给出包含value日期(即1月1日,4月1日,7月1日或10月1日)的季度第一天的日期。
  • 将两者放在一起,即本季度第一天之前或之前的星期日TRUNC( TRUNC( date_value, 'Q' ) + 1, 'IW' ) - 1
  • 因此,季度开始之前或之前的星期日与给定日期之前或之前的星期日之间的天数为:( TRUNC( date_value + 1, 'IW' ) - 1 ) - ( TRUNC( TRUNC( date_value, 'Q' ) + 1, 'IW' ) - 1 ) - 可以简化为取消-1条款。
  • 周数差异就是这个数字除以7(但是给出一个0索引值,并且您希望该季度的周数为1索引;您要么在结果中添加1周,要么在做分工,加7天)。