Иллюстрированный самоучитель по PostgreSQL

Числовые типы

Встроенные константы даты и времени

В PostgreSQL предусмотрено несколько специальных констант, представляющих стандартные значения даты и времени. Эти константы перечислены в табл. 3.23.

Таблица 3.23. Константы даты и времени.

Константа Описание
current Текущее (отложенное) время обработки транзакции. В отличие от now не привязывается к конкретному моменту времени и возвращает текущее системное время
epoch infinity 1970-01-01 00:00:00+00 ("день рождения" Unix) Абстрактная константа, более "поздняя" по сравнению со всеми допустимыми значениями даты и времени
-infinity Абстрактная константа, более "ранняя" по сравнению со всеми допустимыми значениями даты и времени
now Фиксированное время обработки транзакции
today Полночь текущего дня
tomorrow Полночь следующего дня
yesterday Полночь предыдущего дня

В PostgreSQL также поддерживаются три встроенные функции для получения текущего времени, даты и их комбинации. Для них были выбраны подходящие имена current_date, current_time и current_timestamp.

Если судить только по именам, константы now и current на первый взгляд кажутся идентичными. В действительности они принципиально различаются по способу хранения в таблице. Константа now транслируется в системное время на момент выполнения команды (например, время вставки, если константа используется в команде INSERT). С другой стороны, константа current обычно применяется в особых случаях (например, при отслеживании сведений о процессах) для вычисления разности между начальным временем, зафиксированным константой now, и текущим временем; результат определяет время выполнения процесса. В листинге 3.28 константы now и current используются для построения журнала задач. Первая команда создает таблицу с полями для хранения имени задачи, начальной и конечной даты/времени. В таблице создаются записи двух задач, при этом начальное время задается константой now, а конечное время – константой current. Из листинга видно, что обе задачи не завершены.

Внимание
Константы даты/времени, как показано в листинге 3.28, обязательно заключаются в апострофы
.

Листинг 3.28. Использование констант current и now.

booktown=# CREATE TABLE tasklog
booktown=# (taskname char(15),
booktown=# timebegun timestamp,
booktown=# timeflnished timestamp);
CREATE
booktown=# INSERT INTO tasklog VALUES
booktown=# ('delivery', 'now', 'current'):
INSERT 169936 1
booktown=# INSERT INTO tasklog
VALUES booktown=# ('remodeling', 'now', 'current');
INSERT 169937 1
booktown=# SELECT taskname, tlmefnished – timebegun
booktown-# AS timespent FROM tasklog;
taskname | timespent
delivery | 00:15-0.32
remodeling [ 00:04:42
(2 rows)

Итак, константа now обычно используется при сохранении в таблице фиксированного момента времени, который не изменяется при последующих ссылках. Как видно из листинга 3.29, плохое понимание различий между константами now и current приводит к потенциальным ошибкам программирования SQL. В листинге приведены две команды INSERT; в первой команде используется now, а во второй – current. Сравнение результатов показывает, что в первой строке при каждом запросе время обновляется, а во второй строке оно всегда остается одинаковым.

Листинг 3.29. Сравнение констант now и current.

booktown=# INSERT INTO shipments (customer_id .isbn, ship_date)
Ccustomer_id, isbn, ship_date)
booktown-# VALUES (1. '039480001X', 'current');
INSERT 3391221 1
booktown=# INSERT INTO shipments (customer_id .isbn, ship_date)
booktown-# VALUES (2. '0394800753'. 'now');
INSERT 3391222 1
booktown=# SELECT isbn .ship_date FROM shipments: isbn | ship_date
039480001X [ current 0394800753 | 2001-08-10 18:17:49-07
(2 rows)

booktown=# SELECT isbn.
booktown-# to_char(ship_date. 'YYYY-MM-DD HH24:MI:SS')
booktown-# AS value
booktown-# FROM shipments; isbn value
039480001X | 2001-08-10 18:21:22 0394800753 | 2001-08-10 18:17:49
(2 rows)

booktown=# SELECT isbn.
booktown-# to_char(ship_date. 'YYYY-MM-DD HH24:MI:SS')
booktown-# AS value
booktown-# FROM shipments;
isbn | value
039480001X | 2001-08-10 18:22:35 0394800753 | 2001-08-10 18:17:49
(2 rows)
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.