Oracle 11g - FOR循环只将工作日插入表中?

时间:2011-07-05 18:57:46

标签: sql oracle date for-loop oracle11g

我想将一些数据插入与下一年日期相关的表格中。我实际上只需要插入工作日。

 BEGIN
  FOR i IN 1..365 LOOP
  INSERT INTO MY_TABLE (ID, MY_DATE)
  VALUES (i, (to_date(sysdate,'DD-MON-YY')-1)+i);
  END LOOP;
 END;

我可以通过返回并删除周末的行来解决我的问题,但这似乎相当不优雅 - 有人能想到一种方法来修改我的循环以便它跳过周末吗?

4 个答案:

答案 0 :(得分:7)

您可以在插入行之前检查星期几(星期几的名称将取决于您的NLS设置,因此这不是最强大的解决方案)

 BEGIN
  FOR i IN 1..365 LOOP
    IF( to_char(sysdate-1+i,'fmDAY') NOT IN ('SATURDAY', 'SUNDAY') )
    THEN
      INSERT INTO MY_TABLE (ID, MY_DATE)
        VALUES (i, (to_date(sysdate,'DD-MON-YY')-1)+i);
    END IF;
  END LOOP;
 END;

答案 1 :(得分:3)

我建议使用to_date(your_date,'d')作为@Jeff Moore提及。但是,我也建议摆脱for..loop。作为奖励,这将增加任何给定年份的所有日期,与您的版本不同,这将在闰年上产生额外的一天:

INSERT INTO MY_TABLE (ID, MY_DATE)
SELECT   lvl, dt
  FROM   (    SELECT   LEVEL lvl,
                       TO_DATE('1/1/2011', 'mm/dd/yyyy') + LEVEL - 1 dt
                FROM   DUAL
          CONNECT BY   TO_DATE('1/1/2011', 'mm/dd/yyyy') + LEVEL - 1 <
                          ADD_MONTHS(TO_DATE('1/1/2011', 'mm/dd/yyyy'), 12))
 WHERE   TO_CHAR(dt, 'd') NOT IN (1, 7)

如果您希望“ID”列是连续的,则可以在外部查询中使用rownum代替lvl

答案 2 :(得分:2)

您可以使用以下日期格式之一来检查它是哪一天。

从双重中选择to_char(sysdate,'DAY'); / *星期二* /
从dual中选择to_char(sysdate,'D'); / * 3 * /
从dual中选择to_char(sysdate,'DY'); / * TUE * /

添加如下所示的if语句,以删除等于SAT或SUN的日期。

BEGIN
  FOR i IN 1..365 LOOP
  IF to_char(sysdate-1+i,'DY') NOT in ('SAT','SUN') THEN

   INSERT INTO MY_TABLE (ID, MY_DATE) VALUES (i, (to_date(sysdate,'DD-MON-YY')-1)+i);
  END IF;
 END LOOP;
END;

答案 3 :(得分:0)

如果你让星期一= 0和星期日= 6你可以使用(如果mod(i,7)&lt; 4)),那么插入......应该有效。