Oracle 11g - цикл FOR, который вставляет в таблицу только дни недели? - PullRequest
3 голосов
/ 05 июля 2011

Я хочу вставить некоторые данные в таблицу, связанную с датами на следующий год. На самом деле мне нужны только рабочие дни.

 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 ]

7 голосов
/ 05 июля 2011

Вы всегда можете проверить день недели перед вставкой строки (названия дней недели будут зависеть от настроек 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;
3 голосов
/ 06 июля 2011

Я бы предложил использовать 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 во внешнем запросе.

2 голосов
/ 05 июля 2011

Вы можете использовать один из следующих форматов даты, чтобы проверить, какой сегодня день.

выберите to_char (sysdate, 'DAY') из двойного; / * ВТОРНИК * /
выберите to_char (sysdate, 'D') из двойного; / * 3 * /
выберите 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;
0 голосов
/ 05 июля 2011

Если вы укажете Monday = 0 и Sunday = 6, вы можете использовать (если mod (i, 7) <4)), тогда Insert ... должен работать. </p>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...