我想找到所有这方面的解决方案“在给定的年份间隔内获得每周的天数(星期一,星期二,网络,...,太阳)”
有人知道其他答案吗?请分享;)
这是我的查询:)
WITH dat AS
(SELECT &&start_year + level - 1 cur_year, DECODE(MOD(&start_year + level - 1, 4), 0, 0, 1) no_leap,
TO_NUMBER(TO_CHAR(TO_DATE('01.01.'||TO_CHAR(&start_year + level - 1)), 'D')) d
FROM dual
CONNECT BY LEVEL < &end_year - &start_year + 2)
SELECT cur_year,
51 + DECODE(no_leap, 1, DECODE(d, 1, 2, 1), DECODE(d, 1, 2, 7, 2, 1)) mon,
51 + DECODE(no_leap, 1, DECODE(d, 2, 2, 1), DECODE(d, 2, 2, 1, 2, 1)) tue,
51 + DECODE(no_leap, 1, DECODE(d, 3, 2, 1), DECODE(d, 3, 2, 2, 2, 1)) wed,
51 + DECODE(no_leap, 1, DECODE(d, 4, 2, 1), DECODE(d, 4, 2, 3, 2, 1)) thu,
51 + DECODE(no_leap, 1, DECODE(d, 5, 2, 1), DECODE(d, 5, 2, 4, 2, 1)) fri,
51 + DECODE(no_leap, 1, DECODE(d, 6, 2, 1), DECODE(d, 6, 2, 5, 2, 1)) sat,
51 + DECODE(no_leap, 1, DECODE(d, 7, 2, 1), DECODE(d, 7, 2, 6, 2, 1)) sun
FROM dat;
答案 0 :(得分:0)
您应该利用Oracle的日期算法。当您相互减去两个日期时,将返回一个数字,即两个日期之间的天数。如果没有整数差异,则返回实际差异:
SQL> select sysdate - to_date('20120504 15', 'yyyymmdd hh24') from dual;
SYSDATE-TO_DATE('2012050415','YYYYMMDDHH24')
--------------------------------------------
3.76489583
请注意,这不包括timestamp
,仅包含date
个数据类型。执行timestamp
算术会返回interval
数据类型。
大多数解决方案都是
with dates as (
select to_char(to_date('&start_year','yyyy') + level, 'fmDAY') as days
from dual
connect by level < to_date('&end_year','yyyy') - to_date('&start_year','yyyy')
)
select ...
请注意格式模型的fm
modifier;这会删除尾随空格。
作为一般规则,在处理日期时,最好使用日期,而不是数字或字符。您的connect by
条款CONNECT BY LEVEL < &end_year - &start_year + 2
虽然简单,但却让您做了很多额外的工作才能让您的解决方案发挥作用。