Функции для работы с датой и временем
В PostgreSQL поддерживаются как стандартные функции SQL current_date, current_time и current_timestamp, так и множество нестандартных функций. Функции PostgreSQL, предназначенные для работы с датой и временем, перечислены в табл. 5.11.
Таблица 5.11. Функции для работы с датой и временем
Функция | Описание |
current date |
Возвращает текущую дату в виде значения типа date |
current time |
Возвращает текущее время в виде значения типа time |
current timestamp |
Возвращает текущие дату и время в виде значения типа timestamp |
date_part(s. t) |
Выделяет из значения типа timestamp компонент даты или времени, определяемый строкой s |
date_part(s. i) |
Выделяет из значения типа interval компонент даты или времени, определяемый строкой s |
date trunc(s, t) |
Возвращает значение типа timestamp, усеченное до точности s |
extract (k FROM t) |
Выделяет из значения типа timestamp компонент даты или времени, определяемый ключевым словом k |
extracttk FROM i) |
Выделяет из значения типа interval компонент даты или времени, определяемый ключевым словом k |
isfinite(t) |
Возвращает true, если значение типа timestamp соответствует конечной величине (не invalid и не infinity) |
isfinite(i) |
Возвращает true, если значение типа interval соответствует конечной величине (не infinity) |
now() |
Возвращает текущие дату и время в виде значения типа timestamp. Эквивалент константы now |
timeofdayO |
Возвращает текущие дату и время в виде значения типа text |
Ниже приведены более подробные описания всех функций, перечисленных в таблице. Обратите внимание на отсутствие круглых скобок в определениях функций current_date, current_time и current_timestamp — это сделано для сохранения совместимости со стандартом SQL92.
current_date
Синтаксис:
current_date
Функция current_date вызывается без аргументов и возвращает текущую дату в виде значения типа date. Результат эквивалентен преобразованию специальной константы now к типу date.
Пример
booktown=# SELECT current_date,
booktown-# 'now'::date AS date;
date date
2001-08-31 | 2001-08-31
(1 row)
current_time
Синтаксис:
current_time
Функция current_time вызывается без аргументов и возвращает текущее время в виде значения типа time. Результат эквивалентен преобразованию специальной константы now к типу time.
Пример
booktown=# SELECT current_time,
booktown-# 'now'::time AS time;
time | time
11:36:52 | 11:36:52
(1 row)
current_timestamp
Синтаксис:
current_timestamp
Функция current_timestamp вызывается без аргументов и возвращает текущее время в виде значения типа timestamp. Результат эквивалентен преобразованию специальной константы now к типу timestamp или вызову функции now().
Пример
booktown=# SELECT current_timestamp.
booktown-# now() AS timestamp;
timestamp | timestamp
2001-08-31 11:39:42-07 2001-08-31 11:39:42-07
(1 row)
date_part()
Синтаксис:
date_part(s. t) date_part(s. i)
Функция date_part() получает два аргумента. Первый аргумент s относится к типу text, а второй, t или I, — к типу timestamp или interval соответственно. Функция выделяет во втором аргументе компонент, определяемый строкой s, и возвращает его в виде значения типа doubl e preci si on.
Чтобы лучше понять, как работает функция date_part(), представьте, что значение типа timestamp или interval делится на компоненты — часы, минуты и т. д. Эти компоненты (и соответственно допустимые значения аргумента s) перечислены в табл. 5.12. Помните, что некоторые значения относятся только к типу tlmestamp и не поддерживаются для типа Interval.
Таблица 5.12. Компоненты типов timestamp и interval
Компонент | Описание |
century |
Год, разделенный на 100 (не совпадает с текущим веком!) |
day |
День месяца (от 1 до 31) для типа timestamp, продолжительность интервала в днях для типа interval |
decade |
Год, разделенный на 10 |
dow |
День недели (от 0 до 6), начиная с воскресенья. Для типа interval не поддерживается |
doy |
День года (от 1 до 366). Для типа interval не поддерживается |
epoch |
Количество секунд от начала эпохи (1 января 1970 г.) для типа timestamp, продолжительность интервала в секундах для типа interval |
hour |
Час в значении типа timestamp |
microseconds |
Количество миллионных долей в дробной части секунд для значения типа timestamp |
millennium |
Год, разделенный на 1000 (не совпадает с текущим тысячелетием!) |
mi 11 i seconds |
Количество тысячных долей в дробной части секунд для значения типа timestamp |
minute |
Минуты в значении типа timestamp или interval |
month |
Месяц в значении типа timestamp или остаток от деления продолжительности интервала в месяцах на 12 для типа interval |
quarter |
Квартал (от 1 до 4) для значений типа timestamp |
second |
Секунды в значении типа timestamp или interval |
week |
Номер недели в году для значений типа timestamp. В стандарте ISO-8601 первая неделя года определяется как неделя, в которую входит 4 января |
year |
Год в значении типа timestamp или interval |
Примеры
booktown=# SELECT date_part('minute'.
booktown(# intervalC3 days 4 hours 12 minutes')):
date_part
12
(1 row)
booktown=# SELECT isbn,
booktown-l date_part('year', publication)
booktown-# FROM editions
booktown-# ORDER BY date_part ASC
booktown-# LIMIT 3;
isbn | date_part
0760720002 | 1868
0679803335 | 1922
0694003611 | 1947
(3 rows)
ПРИМЕЧАНИЕ
Аналогом функции date_part() в SQL является функция extract().
date_trunc()
Синтаксис: date_trunc(s. t)
Функция date_trunc () получает два аргумента s и t, относящихся к типам text и timestamp соответственно. Строка s определяет компонент, до которого усекается аргумент t. В данном контексте под усечением понимается удаление всех компонентов, детализация которых превышает заданную.
Допустимые значения аргумента s перечислены в табл. 5.12.
Пример
booktown=# SELECT date_trune('minute', now());
date trunc
2001-08-31 09:59:00-07
(1 row)
booktown=# SELECT date_trunc( 'hour', now());
date trunc
2001-08-31 09:00:00-07 (1 row)
booktown=# SELECT date_trunc('year', now());
date trunc
2001-01-01 00:00:00-08
(1 row)
extract()
Синтаксис:
extract(k FROM t) extract(k FROM 1)
Функция SQL92 extractO представляет собой аналог функции PostgreSQL date_part() со слегка измененным синтаксисом. При перечислении аргументов вместо запятой используется ключевое слово FROM. Аргументы аналогичны аргументам функции date_part(), хотя первый аргумент является ключевым словом SQL, а не строкой и поэтому не заключается в кавычки. Допустимые значения k перечислены в табл. 5.12.
Учтите, что функция extractO является «псевдонимом» функции PostgreSQL date_part () в синтаксисе SQL92, поэтому по умолчанию в выходных данных функция extract() представляется именем date_part.
Примеры
booktown=# SELECT extract(MINUTE FROM
interval('3 days 12 minutes1)): datejpart
12
(1 row)
booktown=# SELECT extractCMONTH FROM now()):
date_part
8
(1 row)
isfinite()
Синтаксис:
isfinite(t) isfinite(i)
Функция 1 sf 1 ni te() получает один аргумент типа timestamp или 1 interval. Она возвращает true, если переданное значение не является бесконечным, созданным при помощи специальной константы Infinity или invalid (используется только для timestamp).
Пример
booktown=# SELECT isfinite('now'::timestamp) AS now_is_finite,
booktown-# isfinite('infinity'::timestamp) AS Infinity,
booktown-# isfiniteC'invalid'::timestamp) AS invalid;
now_is_finite | infinity | invalid
(1 row)
now()
Синтаксис:
now()
Функция now() вызывается без аргументов и возвращает текущую дату и время в виде значения типа timestamp.
Пример
booktown=# SELECT now();
now
2001-08-31 10:31:18-07
(1 row)
timeofday()
Синтаксис: timeofdayO
Функция timeofday() вызывается без аргументов и возвращает текущие время и дату. Она похожа на функцию now(), но возвращает значение типа text. Это делает ее менее удобной, поскольку значение не разделяется на компоненты функциями date_part() и to_char() без предварительного преобразования к другому типу.
Пример
Dooktown=# SELECT timeofday();
timeofday
Fn Aug 31 10:33:00.837338 2001 PDT
(1 row)