簡體   English   中英

Oracle 11g - 僅將工作日插入表中的 FOR 循環?

[英]Oracle 11g - FOR loop that inserts only weekdays into a table?

我想將一些數據插入與明年日期相關的表中。 我實際上只需要插入工作日。

 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;

我可以通過返回並刪除周末的行來解決我的問題,但這似乎相當不雅 - 任何人都可以想出一種方法來修改我的循環以使其跳過周末嗎?

您始終可以在插入行之前檢查星期幾(星期幾的名稱將取決於您的 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;

我建議使用@Jeff Moore 提到to_date(your_date,'d') 但是,我還建議擺脫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

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

select to_char(sysdate,'DAY') from dual; /* 周二 */
select to_char(sysdate,'D') from dual; /* 3 */
select to_char(sysdate,'DY') 從雙; /* 周二 */

添加如下所示的 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;

如果你讓 Monday = 0 和 Sunday = 6 你可以使用 (if mod(i,7) < 4 )) 那么 Insert... 應該可以工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM