oracle中的每周日历表更新备用周标志&日期

时间:2014-02-13 21:08:52

标签: oracle

我正在创建一个表来填充每周日历表,我的要求是每周星期日更新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

2 个答案:

答案 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 functionSUN参数必须使用您的本地会话语言,因此如果您不使用英语,请将其更改为适合的语言。作为一次性插入,我不认为在这种情况下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