我想将一些数据插入与下一年日期相关的表格中。我实际上只需要插入工作日。
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;
我可以通过返回并删除周末的行来解决我的问题,但这似乎相当不优雅 - 有人能想到一种方法来修改我的循环以便它跳过周末吗?
答案 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)),那么插入......应该有效。