我正在创建一个表来填充每周日历表,我的要求是每周星期日更新wk_start_date
,并且每两周将pr_wk_flag
填充为Y
并且
beg dt
& end dt
将从星期四前两周到现在的星期三
如下所示,如何在oracle plsql中填充
Wk_start_date pr_wk_flag beg dt end dt
2/9/2014 Y 1/30/2014 2/12/2014
2/16/2014 N NULL NULL
2/23/2014 Y 2/13/2014 2/26/2014
3/2/2014 N NULL NULL
3/9/2014 Y 2/27/2014 3/12/2014
答案 0 :(得分:2)
这是一种方式:
select wk_start_dt, pr_wk_flag,
case when pr_wk_flag = 'Y' then wk_start_dt - 10 end as beg_dt,
case when pr_wk_flag = 'Y' then wk_start_dt + 3 end as end_dt
from (
select next_day(date '2014-02-01' + (7 * level), 'SUN') as wk_start_dt,
decode(mod(level, 2), 1, 'Y', 'N') as pr_wk_flag
from dual
connect by level <= 6
);
内部查询是生成值序列的常用方法。调整开始日期和迭代次数以更改生成的周开始范围,并在必要时翻转标志值。 the next_day
function的SUN
参数必须使用您的本地会话语言,因此如果您不使用英语,请将其更改为适合的语言。作为一次性插入,我不认为在这种情况下NLS敏感性是一个问题。
外部查询只使用该标志来决定是否计算其他两个日期,或将它们保留为空。
SQL Fiddle演示。
答案 1 :(得分:0)
你有所有2014年
SELECT dates+(8- to_char(TRUNC (TRUNC (dates, 'w'), 'YEAR'),'d')) wk_start_date,
DECODE (MOD (TO_NUMBER (TO_CHAR (dates, 'w')), 2), 0, 'Y', 'N')
pr_wk_flag,
DECODE (MOD (TO_NUMBER (TO_CHAR (dates, 'w')), 2),
0, dates + 5 - 17,
NULL)
pr_wk_flag,
DECODE (MOD (TO_NUMBER (TO_CHAR (dates, 'w')), 2), 0, dates + 3, NULL)
end_dt
FROM (SELECT TRUNC (SYSDATE, 'YEAR') + 7 * (ROWNUM - 1) dates
FROM dba_tables
WHERE TRUNC (TRUNC (SYSDATE, 'YEAR') + 7 * (ROWNUM - 1), 'YEAR') =
TRUNC (SYSDATE, 'YEAR'))
ORDER BY wk_start_date ASC
SELECT dates+(8- to_char(TRUNC (TRUNC (dates, 'w'), 'YEAR'),'d')) wk_start_date,
DECODE (MOD (TO_NUMBER (TO_CHAR (dates, 'w')), 2), 0, 'Y', 'N')
pr_wk_flag,
DECODE (MOD (TO_NUMBER (TO_CHAR (dates, 'w')), 2),
0, dates + 5 - 17,
NULL)
pr_wk_flag,
DECODE (MOD (TO_NUMBER (TO_CHAR (dates, 'w')), 2), 0, dates + 3, NULL)
end_dt
FROM (SELECT TRUNC (SYSDATE, 'YEAR') + 7 * (ROWNUM - 1) dates
FROM dba_tables
WHERE TRUNC (TRUNC (SYSDATE, 'YEAR') + 7 * (ROWNUM - 1), 'YEAR') =
TRUNC (SYSDATE, 'YEAR'))
ORDER BY wk_start_date ASC