Пишем наш маленький справочник далее, вот еще несколько функций работы с датами. Запишем такой блок:
SET SERVEROUTPUT ON BEGIN -- Function ROUND() -- DBMS_OUTPUT.put_line( '56*-> '||ROUND(TO_DATE('15-05-1998'), 'MM')); -- Function ROUND() -- DBMS_OUTPUT.put_line( '57*-> '||ROUND(TO_DATE('15-05-1998'), 'DY')); -- Function ROUND() -- DBMS_OUTPUT.put_line( '58*-> '||ROUND(TO_DATE('15-05-1998'), 'WW')); -- Function TRUNC() -- DBMS_OUTPUT.put_line( '59*-> '||TO_CHAR(TRUNC(TO_DATE('15-05-1977 15:34:12', 'DD-MM-YYYY HH24:MI:SS'), 'YEAR'), 'DD-MM-YYYY HH24:MI:SS')); -- Function TRUNC() -- DBMS_OUTPUT.put_line( '60*-> '||TO_CHAR(TRUNC(TO_DATE('12-04-1999 10:24:42', 'DD-MM-YYYY HH24:MI:SS'), 'MM'), 'DD-MM-YYYY HH24:MI:SS')); -- Function TRUNC() -- DBMS_OUTPUT.put_line( '61*-> '||TO_CHAR(TRUNC(TO_DATE('02-09-2003 05:22:55', 'DD-MM-YYYY HH24:MI:SS'), 'IW'), 'DD-MM-YYYY HH24:MI:SS')); -- Function SYSDATE() -- DBMS_OUTPUT.put_line( '62*-> Now Time is: '||TO_CHAR(SYSDATE, 'MONTH DD YYYY HH24:MI:SS')); -- Function SYSDATE() -- DBMS_OUTPUT.put_line( '63*-> Now Time is: '||TO_CHAR(SYSDATE, 'DD-MM-YYYY HH24:MI:SS')); END; /
После запуска в SQL*Plus получаем:
SQL> SET SERVEROUTPUT ON SQL> SQL> BEGIN 2 3 -- Function ROUND() -- 4 DBMS_OUTPUT.put_line( '56*-> '||ROUND(TO_DATE('15-05-1998'), 'MM')); 5 6 -- Function ROUND() -- 7 DBMS_OUTPUT.put_line( '57*-> '||ROUND(TO_DATE('15-05-1998'), 'DY')); 8 9 -- Function ROUND() -- 10 DBMS_OUTPUT.put_line( '58*-> '||ROUND(TO_DATE('15-05-1998'), 'WW')); 11 12 -- Function TRUNC() -- 13 DBMS_OUTPUT.put_line( '59*-> '||TO_CHAR(TRUNC(TO_DATE('15-05-1977 15:34:12', 14 'DD-MM-YYYY HH24:MI:SS'), 'YEAR'), 'DD-MM-YYYY HH24:MI:SS')); 15 16 -- Function TRUNC() -- 17 DBMS_OUTPUT.put_line( '60*-> '||TO_CHAR(TRUNC(TO_DATE('12-04-1999 10:24:42', 18 'DD-MM-YYYY HH24:MI:SS'), 'MM'), 'DD-MM-YYYY HH24:MI:SS')); 19 20 -- Function TRUNC() -- 21 DBMS_OUTPUT.put_line( '61*-> '||TO_CHAR(TRUNC(TO_DATE('02-09-2003 05:22:55', 22 'DD-MM-YYYY HH24:MI:SS'), 'IW'), 'DD-MM-YYYY HH24:MI:SS')); 23 24 -- Function SYSDATE() -- 25 DBMS_OUTPUT.put_line( '62*-> Now Time is: '||TO_CHAR(SYSDATE, 'MONTH DD YYYY HH24:MI:SS')); 26 27 -- Function SYSDATE() -- 28 DBMS_OUTPUT.put_line( '63*-> Now Time is: '||TO_CHAR(SYSDATE, 'DD-MM-YYYY HH24:MI:SS')); 29 30 END; 31 / 56*-> 01.05.98 57*-> 18.05.98 58*-> 14.05.98 59*-> 01-01-1977 00:00:00 60*-> 01-04-1999 00:00:00 61*-> 01-09-2003 00:00:00 62*-> Now Time is: НОЯБРЬ 15 2003 19:50:58 63*-> Now Time is: 15-11-2003 19:50:58 Процедура PL/SQL успешно завершена.
Итак, начинаем по немногу разбираться.
Формат | Единица округления или усечения |
---|---|
СС, SCC | Век |
SYYYY, YYYY, YEAR, SYEAR, YYY, YY, Y | Год (округляется до 1 июля) |
IYYY, IYY, IY, I | Год ISO |
Q | Квартал (округляется до шестнадцатого дня второго месяца квартала) |
MONTH, MON, MM, RM | Месяц (округляется до шестнадцатого дня) |
WW | То же день недели, что и первый день года |
IW | То же день недели, что и первый день года ISO |
W | То же день недели, что и первый день месяца |
DDD, DD, J | День |
Day, DY, D | Первый день недели |
HH, HH12, HH24 | Час |
MI | Минута |
Если "формат" не указан, применяется формат по умолчанию 'DD', который округляет d до ближайшего дня. Пример 56*, 57*, 58*.
Так, же в PL/SQL предусмотрены некоторые арифметические действия с датами, давайте рассмотрим основные из них:
Операция | Тип возвращаемого значения | Описание |
---|---|---|
d1 - d2 | NUMBER (!) | Возвращается разница в днях между d1 и d2. Это значение является действительным числом, где дробная часть означает неполный день. |
d1 + d2 | - | ЗАПРЕЩЕНА (Сколько, я функций написал из за этого!!!) |
d1 + n | DATE | К d1 добавляется n дней и возвращается результат, имеющий тип DATE. n может быть вещественным числом содержащим не полный день. |
d1 - n | DATE | Из d1 вычитается n дней и возвращается результат, имеющий тип DATE. n может быть вещественным числом содержащим не полный день. |
Давайте посмотрим несколько примеров:
DECLARE D1 DATE; D2 DATE; BEGIN D1 := TO_DATE('12-10-2003 15:10:34', 'DD-MM-YYYY HH24:MI:SS'); D2 := TO_DATE('11-03-2003 11:11:22', 'DD-MM-YYYY HH24:MI:SS'); -- Function SYSDATE() -- DBMS_OUTPUT.put_line( '64*-> Today: '||TO_CHAR(SYSDATE, 'MONTH DD YYYY')); -- Function SYSDATE() -- DBMS_OUTPUT.put_line( '65*-> Tomorrow: '||TO_CHAR(SYSDATE - 1, 'MONTH DD YYYY')); -- Function SYSDATE() -- DBMS_OUTPUT.put_line( '66*-> Return to The Future: '||TO_CHAR(SYSDATE + 1, 'MONTH DD YYYY')); -- Function SYSDATE() -- DBMS_OUTPUT.put_line( '67*-> Today: '||TO_CHAR(D1 - D2)); END; /
После запуска в SQL*Plus получаем:
SQL> DECLARE 2 3 D1 DATE; 4 D2 DATE; 5 6 BEGIN 7 8 D1 := TO_DATE('12-10-2003 15:10:34', 'DD-MM-YYYY HH24:MI:SS'); 9 D2 := TO_DATE('11-03-2003 11:11:22', 'DD-MM-YYYY HH24:MI:SS'); 10 11 -- Function SYSDATE() -- 12 DBMS_OUTPUT.put_line( '64*-> Today: '||TO_CHAR(SYSDATE, 'MONTH DD YYYY')); 13 14 -- Function SYSDATE() -- 15 DBMS_OUTPUT.put_line( '65*-> Tomorrow: '||TO_CHAR(SYSDATE - 1, 'MONTH DD YYYY')); 16 17 -- Function SYSDATE() -- 18 DBMS_OUTPUT.put_line( '66*-> Return to The Future: '||TO_CHAR(SYSDATE + 1, 'MONTH DD YYYY')); 19 20 -- Function SYSDATE() -- 21 DBMS_OUTPUT.put_line( '67*-> Today: '||TO_CHAR(D1 - D2)); 22 23 END; 24 / 64*-> Today: НОЯБРЬ 15 2003 65*-> Tomorrow: НОЯБРЬ 14 2003 66*-> Return to The Future: НОЯБРЬ 16 2003 67*-> Today: 215,166111111111111111111111111111111111 Процедура PL/SQL успешно завершена.
64* Показывает текущую дату, 65* возвращает нас в прошлое, (чем не машина времени!) 66* отправляет нас в будущее (Г. Уэллс просто отдыхает!) А, последний пример показывает разницу двух дат, в формате NUMBER! Вот так работают функции обработки дат! Пробуйте сами!!! :)