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

Продолжаем наши справочники! Итак, определим такой блок:

SET SERVEROUTPUT ON

BEGIN

	-- Function  ADD_MONTHS() --
	DBMS_OUTPUT.put_line('46*-> '||ADD_MONTHS('09-02-2000', 5));

	-- Function  ADD_MONTHS() --
	DBMS_OUTPUT.put_line('47*-> '||ADD_MONTHS('18-06-2001', 3));

	-- Function  ADD_MONTHS() --
	DBMS_OUTPUT.put_line('48*-> '||ADD_MONTHS('12-02-1981', 2));

	-- Function  LAST_DAY() --
	DBMS_OUTPUT.put_line('49*-> '||LAST_DAY('09-02-2000')||' '||LAST_DAY('19-02-2001'));

	-- Function  LAST_DAY() --
	DBMS_OUTPUT.put_line('50*-> '||LAST_DAY('05-03-2002'));

	-- Function  MONTHS_BETWEEN() --
	DBMS_OUTPUT.put_line('51*-> '||MONTHS_BETWEEN('16-04-1973', '16-03-1997'));

	-- Function  MONTHS_BETWEEN() --
	DBMS_OUTPUT.put_line('52*-> '||MONTHS_BETWEEN('18-04-1972', '23-03-1961'));

	-- Function  NEW_TIME() --
	DBMS_OUTPUT.put_line( '53*-> '||TO_CHAR(NEW_TIME(TO_DATE('12-04-1971 12:00:00', 'DD-MM-YYYY HH24:MI:SS'),
		'PST', 'EST'), 'DD-MON-YYYY HH24:MI:SS')||': Pacific -> Eastern' );

	-- Function  NEXT_DAY() --
	DBMS_OUTPUT.put_line( '54*-> '||NEXT_DAY('07-04-2003', 'Понедельник'));

	-- Function  NEXT_DAY() --
	DBMS_OUTPUT.put_line( '55*-> '||NEXT_DAY('01-03-1998', 'Четверг'));
  
END;
/

После запуска в SQL*Plus получаем:

SQL> BEGIN
  2  
  3  	-- Function  ADD_MONTHS() --
  4  	DBMS_OUTPUT.put_line('46*-> '||ADD_MONTHS('09-02-2000', 5));
  5  
  6  	-- Function  ADD_MONTHS() --
  7  	DBMS_OUTPUT.put_line('47*-> '||ADD_MONTHS('18-06-2001', 3));
  8  
  9  	-- Function  ADD_MONTHS() --
 10  	DBMS_OUTPUT.put_line('48*-> '||ADD_MONTHS('12-02-1981', 2));
 11  
 12  	-- Function  LAST_DAY() --
 13  	DBMS_OUTPUT.put_line('49*-> '||LAST_DAY('09-02-2000')||' '||LAST_DAY('19-02-2001'));
 14  
 15  	-- Function  LAST_DAY() --
 16  	DBMS_OUTPUT.put_line('50*-> '||LAST_DAY('05-03-2002'));
 17  
 18  	-- Function  MONTHS_BETWEEN() --
 19  	DBMS_OUTPUT.put_line('51*-> '||MONTHS_BETWEEN('16-04-1973', '16-03-1997'));
 20  
 21  	-- Function  MONTHS_BETWEEN() --
 22  	DBMS_OUTPUT.put_line('52*-> '||MONTHS_BETWEEN('18-04-1972', '23-03-1961'));
 23  
 24  	-- Function  NEW_TIME() --
 25  	DBMS_OUTPUT.put_line( '53*-> '||TO_CHAR(NEW_TIME(TO_DATE('12-04-1971 12:00:00', 'DD-MM-YYYY HH24:MI:SS'),
 26  		'PST', 'EST'), 'DD-MON-YYYY HH24:MI:SS')||': Pacific -> Eastern' );
 27  
 28  	-- Function  NEXT_DAY() --
 29  	DBMS_OUTPUT.put_line( '54*-> '||NEXT_DAY('07-04-2003', 'Понедельник'));
 30  
 31  	-- Function  NEXT_DAY() --
 32  	DBMS_OUTPUT.put_line( '55*-> '||NEXT_DAY('01-03-1998', 'Четверг'));
 33  
 34  END;
 35  /
46*-> 09.07.00                                                                  
47*-> 18.09.01                                                                  
48*-> 12.04.81                                                                  
49*-> 29.02.00 28.02.01                                                         
50*-> 31.03.02                                                                  
51*-> -287                                                                      
52*-> 132,83870967741935483870967741935483871                                   
53*-> 12-АПР-1971 15:00:00: Pacific -> Eastern                                  
54*-> 14.04.03                                                                  
55*-> 05.03.98                                                                  

Процедура PL/SQL успешно завершена.

Если у кого-то, данный блок вызвал ошибки ничего страшного нет, просто у вас скорее всего не выставлен язык системы, об этом мы уже говорили. А, так же формат даты в самой Windows установите dd.MM.YYYY. Я думаю, что ошибок не будет. Теперь, давайте разберемся с функциями. Данные функции, работают с датами и возвращают дату, за исключением функции MONTHS_BETWEEN, которая возвращает, значение типа NUMBER. Я считаю этот блок функций очень интересным и полезным для дальнейшего применения.

ADD_MONTHS(d,x)
Возвращает дату d плюс x месяцев. Значение x может быть любым целым числом. Если в месяце, полученном в результате, число дней меньше, чем в месяце d то, возвращается последний день месяца результата. Если, число дней не меньше то день месяца-результата и день месяца d совпадают. Временные компоненты даты d и результата одинаковы. Пример 46*, 47*, 48*.
LAST_DAY(d)
Возвращает дату последнего дня того месяца, в который входит d. Эту функцию, можно применять для определения количества дней оставшихся в текущем месяце. Пример 49*, 50*.
MONTHS_BETWEEN(дата 1, дата 2)
Возвращает число месяцев между "дата 1" и "дата 2". Если дни в "дата 1" и "дата 2" или если обе даты являются последними днями своих месяцев. То, результат представляет собой целое число. В противном случае результат будет содержать дробную часть, по отношению, к 31-дневному месяцу. Пример 51*, 52*.
NEW_TIME(d, пояс 1, пояс 2)
Вот, долго думал, показывать эту функцию или нет, решил ладно, пусть будет. Хотя, я ей еще не пользовался, больно она, какая то... а в прочем решать вам! Итак:
Возвращает дату и время, часового пояса 2 для того момента когда, датой и временем, часового пояса 1 является d. Где пояс 1, пояс 2 это строки символов, для поясного времени Америки. В примере 'PST' и 'EST' это Тихоокеанское поясное время и восточное поясное время соответственно. Точно не знаю, есть ли эти строки для России, но вообще, в этом случае, я применял другие способы определения времени по поясам, как правило, в клиентских приложениях, например, применив C++. Но может, у кого есть другое мнение на сей счет! Кстати в примере показаны, функции преобразования, с которыми вы еще не сталкивались, по этому, пока можете сами разобраться. Если не совсем понятно, я о них еще расскажу! :) Пример 53*;
NEXT_DAY(d, строка_символов)
Возвращает дату первого дня, наступающего после даты d и обозначенного строкой символов. Строка символов указывает день недели на языке текущего сеанса. (Вот с 8.1.5 иногда бывают проблемы с передачей русских слов например, в сеанс SQL*Plus, но на удивление 9.0.2 они полностью отсутствуют!) Временной компонент возвращаемого значения тот же, что и временной компонент d. Регистр символов строки значения не имеет. Пример 54*, 55*.

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