Самоучитель по SQL-сервер в Linux

         

Функции для работы с датой и временем

В 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)



Содержание раздела