Числовые типы
Встроенные константы даты и времени
В 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)