我需要SQL查询,该查询将以sam格式在给定的一周内以2017W03的格式返回前10周。
因此,对于格式为2017W05的一周,此查询应返回:
2017W05
2017W04
2017W03
2017W02
2017W01
2016W52
2016W51
2016W50
2016W49
2016W48
答案 0 :(得分:1)
这是一个简化的解决方案,利用了1月4日始终属于同年的第一个ISO周的事实。 (1月1日可能会出现在去年的最后一个ISO周,这将导致并发症。)
早期版本(可通过点击答案下面的"编辑的......"链接进行审核)没有利用此观察结果。
另外,归功于tbone - 为了获得正确的ISO年/周组合,我们必须使用年份的格式模型组件 IYYY
(在TO_CHAR
中),而不是 YYYY
。
with
input ( str ) as (
select '2017W05' from dual
)
select to_char(to_date(substr(str, 1, 4)||'0104', 'yyyymmdd') +
7 * (to_number(substr(str, 6)) - level), 'iyyy"W"iw') as result
from input
connect by level <= 10
;
RESULT
-------
2017W05
2017W04
2017W03
2017W02
2017W01
2016W52
2016W51
2016W50
2016W49
2016W48
答案 1 :(得分:0)
这应该为您提供列出的输出:
select TO_CHAR(to_date('20170201','YYYYMMDD')-(7*(level-1)),'IYYY"W"IW')
from dual
connect by level <= 10
输出:
2017W05
2017W04
2017W03
2017W02
2017W01
2016W52
2016W51
2016W50
2016W49
2016W48
从2017年2月1日的任意日期开始