Шаг 70 - PL/SQL - встроенные функции, даты и снова даты

Пишем наш маленький справочник далее, вот еще несколько функций работы с датами. Запишем такой блок:

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 успешно завершена.

Итак, начинаем по немногу разбираться.

ROUND(d, [, формат])
Округляет дату d, до единицы указанной форматом. Формат соответствует следующей таблице (она же действует и для функции TRUNC):
ФорматЕдиница округления или усечения
СС, 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*.

TRUNC(d, [, формат])
Возвращает дату d усеченную до единицы, указанной "формат". Если "формат" не указан, применяется формат по умолчанию 'DD', который усекает d до ближайшего дня. Пример 59*, 60*, 61*.
SYSDATE
Вот, одна из наиболее полезных функций, которая есть в PL/SQL. Возвращает текущую дату и время в системе. Возвращаемы формат DATE. В примерах 62* и 63* хорошо видно как можно изменить выводимый тип для SYSDATE! Эти маски для преобразования, мы еще рассмотрим, хотя я уже почти все их показал! :)

Так, же в PL/SQL предусмотрены некоторые арифметические действия с датами, давайте рассмотрим основные из них:

ОперацияТип возвращаемого значенияОписание
d1 - d2NUMBER (!)Возвращается разница в днях между d1 и d2. Это значение является действительным числом, где дробная часть означает неполный день.
d1 + d2-ЗАПРЕЩЕНА (Сколько, я функций написал из за этого!!!)
d1 + nDATEК d1 добавляется n дней и возвращается результат, имеющий тип DATE. n может быть вещественным числом содержащим не полный день.
d1 - nDATEИз 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! Вот так работают функции обработки дат! Пробуйте сами!!! :)


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Летучий Сергей - 16.11.2003