2015-05-25 6 views
0

У меня есть несколько вопросов о датах в Oracle.Интервал между двумя датами

Возможно ли получить интервал (в днях) между двумя типами DATE? Если да, можно ли сделать заявление (например, вставить) для каждого дня в этом интервале?

Я думал о

while (a_sequence != difference_between_dates) 
LOOP 
a_sequence.next 
-- do things 
END LOOP; 

Можно ли получить этот интервал с периодическими пробелов? (Как, например, каждый уик-энд. Есть ли в Oracle модуль-оператор?) Я думал о чем-то вроде if(a_sequence % 6 || a_sequence % 7) как условие делать что-то только в выходные дни (предполагая, что нижняя дата всегда в понедельник).

Возможно ли сделать my_date + 1, чтобы получить следующий день?

+2

"* получить интервал (в днях) между двумя ДАТЫ типа *" - 'date_one_column - date_two_column' Это все объясняется в руководстве: https: // Docs. oracle.com/cd/E11882_01/server.112/e41084/sql_elements001.htm#SQLRF00208 и https://docs.oracle.com/cd/E11882_01/server.112/e41084/functions002.htm#SQLRF20033 –

+0

И самый простой способ для получения одной строки за каждый день в этом диапазоне используется таблица календаря. Тогда это просто 'WHERE calendar_date BETWEEN start_date и end_date' – dnoeth

ответ

2

Несомненно. Если вы ищете решение PL/SQL (вы можете сделать это в чистом SQL, но это, вероятно, немного труднее читать), что-то вроде

DECLARE 
    l_first_date date := date '2015-01-01'; 
    l_last_date date := date '2015-12-31'; 
    l_date_to_check date; 
BEGIN 
    FOR i IN 1 .. l_last_date - l_first_date 
    LOOP 
    l_date_to_check := l_first_date + i; 
    if(to_char(l_date_to_check, 'DY') IN ('SAT', 'SUN')) 
    then 
     <<do_something>> 
    end if; 
    END LOOP; 
END; 

Это предполагает, что база данных с использованием английского языка локаль (разные языки, очевидно, имеют разные аббревиатуры для дней). Вы можете сделать код более надежным, указав нулевые настройки NLS в функции to_char, но для большинства систем это добавляет сложности к коду, который никогда не понадобится.

1

мая этот код поможет вам

DECLARE 
    first_date DATE := TO_DATE ('01012015', 'DDMMYYYY'); 
    last_date DATE := TO_DATE ('31012015', 'DDMMYYYY'); 
    a_sequence NUMBER := 25; 
BEGIN 
    LOOP 
     IF a_sequence = last_date - first_date 
     THEN 
     EXIT; 
     END IF; 

     DBMS_OUTPUT.put_line ('Sequence=' || a_sequence); 
     a_sequence := a_sequence + 1; 
    END LOOP; 
END; 
Смежные вопросы