- Как получить текущую дату и время в PostgreSQL?
- Метод 01: функция NOW ()
- Метод 02: CURRENT_TIME, CURRENT_DATE
- Заключение
- Current date sql postgresql
- 9.9.1. EXTRACT , date_part
- Примечание
- 9.9.2. date_trunc
- 9.9.3. AT TIME ZONE
- 9.9.4. Текущая дата/время
- Примечание
- Подсказка
- 9.9.5. Задержка выполнения
- Примечание
- Предупреждение
Как получить текущую дату и время в PostgreSQL?
В mySQL или PostgreSQL есть разные методы или функции для получения текущей даты и времени. В этом руководстве по статье будут рассмотрены все возможные функции и способы просмотра текущих даты и времени. Мы также увидим, как пользователь может изменить текущий регион, чтобы получить другую метку времени в этом руководстве. Итак, начнем с входа в систему из Windows 10.
Метод 01: функция NOW ()
Чтобы проверить текущую дату и время, первой функцией будет функция Now () PostgreSQL. Это самый простой и быстрый способ узнать текущую дату и время при использовании PostgreSQL. Начнем с открытия графического пользовательского интерфейса pgAdmin на панели задач рабочего стола Windows 10. После его открытия перейдите на панель задач pgAmdin и нажмите значок инструмента запроса, чтобы открыть его. После того, как инструмент запроса был открыт в pgAdmin, давайте напишем запрос, чтобы проверить текущую дату и время. Итак, для этого мы написали в нем приведенный ниже запрос функции Now (). Обязательно используйте предложение SELECT в своем запросе, чтобы он работал, как показано ниже. Щелкните треугольный значок «Выполнить», чтобы выполнить следующий запрос. Вывод, показанный на изображении, показывает текущую дату, время и отметку времени, например отметку зоны Пакистана в области вывода данных.
Если вы хотите проверить текущее время и дату другого региона. Вам нужно сначала переключить свой регион на этот регион. Для изменения региона в PostgreSQL использовалась функция TIMEZONE. Мы должны использовать его с предложением SET, чтобы установить наш часовой пояс или изменить его на другой. Итак, мы установили для нашего часового пояса «America / Los_angeles» в области запроса. После этого мы снова использовали функцию Now () с предложением SELECT, чтобы проверить текущую дату и время американского региона. Выполняйте команды, нажимая на значок «Выполнить» на панели задач. Выходные данные демонстрируют текущую дату и метку времени американского региона на снимке ниже.
Многие пользователи PostgreSQL не хотят видеть часовой пояс, а также текущую дату и время. Следовательно, у нас есть решение. Мы будем использовать простой запрос, чтобы игнорировать временные метки при поиске даты и времени. Мы должны использовать метку времени ключевого слова и функцию Now () в запросе, разделенные двойным двоеточием. Итак, мы попробовали следующий запрос в области запроса, чтобы сделать это. Вывод показывает дату и время без часового пояса.
Часто пользователь хочет проверить временную метку следующих часов подряд в PostgreSQL. Это также возможно с помощью простой функции NOW () в запросе с использованием в нем некоторых ключевых слов. Итак, мы использовали нижеупомянутый запрос в оболочке, чтобы увидеть временную метку или время следующего 1 часа от текущего времени. Итак, мы использовали функцию NOW () в скобках, добавив в нее 1-часовой интервал со знаком плюс. Это означает, что он получит текущее время и дату и добавит до 1 часа к текущему времени, чтобы получить метку времени следующего 1 часа с этого момента. Этот метод использовался в предложении SELECT, и результат был отображен с использованием имени столбца «hour_later» в области вывода. Выходной столбец «hour_later» показывает дату вместе со временем следующего часа с часовым поясом.
Вышеупомянутый экземпляр собирался получить метку времени для следующего часа подряд. С другой стороны, пользователь также может проверить временную метку уже прошедшего времени. Например, пользователь может также проверить метку времени, указанную за 2 часа 30 минут назад. Итак, мы должны заменить «1 час» новым интервалом. Мы также изменили имя столбца в соответствии с требованиями. Основное изменение — использование здесь знака минус вместо знака плюса. Это нужно для того, чтобы вычесть последние 2 часа 30 минут из текущей метки времени и получить результаты. Выходные данные показывают дату и время для интервала, прошедшего 2 часа 30 минут назад.
Если пользователь хочет проверить дату и время на следующий день подряд, он / она также может сделать это легко, и метод очень похож на приведенный выше пример. Вы должны заменить ключевое слово «1 час» в запросе на «1 день». Остающийся запрос будет таким же. Вы также можете изменить имя столбца, которое будет отображаться на экране вывода. Итак, мы открыли еще одну вкладку инструмента запросов и выполнили запрос, указанный ниже. После успешной обработки этого запроса мы нашли дату и время следующего дня согласно выходным данным.
Метод 02: CURRENT_TIME, CURRENT_DATE
Вместо использования функции Now () пользователь также может использовать другие функции для получения текущего времени и даты для выбранного региона. Мы использовали часовой пояс американского региона. Итак, по этому мы и получим результаты. На этот раз мы будем использовать различные предложения в запросе SELECT, чтобы получить дату и время для текущего региона. Во-первых, мы использовали предложения CURRENT_TIME и CURRENT_TIMESTAMP в запросе, чтобы получить текущее время и временную метку для американского региона. В обоих столбцах показаны разные стили вывода времени и даты с часовым поясом. Столбец «current_time» показывает только время с часовым поясом, а столбец «current_timestamp» показывает дату и время вместе с часовым поясом в другом формате.
Давайте изменим текущий часовой пояс на другой регион, например, Азия / Карачи, используя ключевое слово TIMEZONE с командой SET.
После изменения региона текущая дата, время и часовой пояс будут изменены в соответствии с ним. Вы можете увидеть результат для того же запроса, что и ниже.
Давайте посмотрим на использование ключевого слова CURRENT_DATE в запросе SELECT для проверки текущей даты в PostgreSQL. Итак, мы попробовали запрос ниже, чтобы получить время и дату для текущего региона, например, Азии. Вывод показывает дату и время с часовым поясом Азии.
Вы также можете получить дату и время в одном столбце вместо двух. Для этого вы должны использовать знак плюса в обоих предложениях, как показано ниже.
Заключение
Мы обсудили функции NOW (), CURRENT_DATE и CURRENT_TIME, чтобы получить текущую дату и время, относящиеся к часовому поясу. Мы видели, как эти функции работают с отметкой часового пояса или без нее. Эти запросы одинаково функциональны в командной строке.
Current date sql postgresql
Все существующие функции для обработки даты/времени перечислены в Таблице 9.32, а подробнее они описаны в следующих подразделах. Поведение основных арифметических операторов ( + , * и т. д.) описано в Таблице 9.31. Функции форматирования этих типов данных были перечислены в Разделе 9.8. Общую информацию об этих типах вы получили (или можете получить) в Разделе 8.5.
Помимо этого, для типов даты/времени имеются обычные операторы сравнения, показанные в Таблице 9.1. Значения даты и даты со временем (с часовым поясом или без него) можно сравнивать как угодно, тогда как значения только времени (с часовым поясом или без него) и интервалы допустимо сравнивать, только если их типы совпадают. При сравнении даты со временем без часового пояса и даты со временем с часовым поясом предполагается, что первое значение задано в часовом поясе, установленном параметром TimeZone, и оно пересчитывается в UTC для сравнения со вторым значением (внутри уже представленным в UTC). Аналогичным образом, при сравнении значений даты и даты со времени первое считается соответствующим полночи в часовом поясе TimeZone .
Все описанные ниже функции и операторы, принимающие аргументы time или timestamp , фактически представлены в двух вариациях: одна принимает тип time with time zone или timestamp with time zone , а вторая — time without time zone или timestamp without time zone . Для краткости эти вариации здесь не разделяются. Кроме того, операторы + и * определяются парами, наделяющими их переместительным свойством (например, date + integer и integer + date ); здесь приводится только один вариант для каждой пары.
Таблица 9.31. Операторы даты/времени
date + integer → date
Добавляет к дате заданное число дней
date ‘2001-09-28’ + 7 → 2001-10-05
date + interval → timestamp
Добавляет к дате интервал
date ‘2001-09-28’ + interval ‘1 hour’ → 2001-09-28 01:00:00
date + time → timestamp
Добавляет к дате время
date ‘2001-09-28′ + time ’03:00’ → 2001-09-28 03:00:00
interval + interval → interval
interval ‘1 day’ + interval ‘1 hour’ → 1 day 01:00:00
timestamp + interval → timestamp
Добавляет к отметке времени интервал
timestamp ‘2001-09-28 01:00′ + interval ’23 hours’ → 2001-09-29 00:00:00
time + interval → time
Добавляет к времени интервал
time ’01:00′ + interval ‘3 hours’ → 04:00:00
Меняет направление интервала
— interval ’23 hours’ → -23:00:00
date — date → integer
Вычитает даты, выдавая разницу в днях
date ‘2001-10-01’ — date ‘2001-09-28’ → 3
date — integer → date
Вычитает из даты заданное число дней
date ‘2001-10-01’ — 7 → 2001-09-24
date — interval → timestamp
Вычитает из даты интервал
date ‘2001-09-28’ — interval ‘1 hour’ → 2001-09-27 23:00:00
time — time → interval
Вычитает из одного времени другое
time ’05:00′ — time ’03:00′ → 02:00:00
time — interval → time
Вычитает из времени интервал
time ’05:00′ — interval ‘2 hours’ → 03:00:00
timestamp — interval → timestamp
Вычитает из отметки времени интервал
timestamp ‘2001-09-28 23:00′ — interval ’23 hours’ → 2001-09-28 00:00:00
interval — interval → interval
Вычитает из одного интервала другой
interval ‘1 day’ — interval ‘1 hour’ → 1 day -01:00:00
timestamp — timestamp → interval
Вычитает из одной отметки времени другую (преобразуя 24-часовые интервалы в дни подобно justify_hours() )
timestamp ‘2001-09-29 03:00’ — timestamp ‘2001-07-27 12:00’ → 63 days 15:00:00
interval * double precision → interval
Умножает интервал на скалярное значение
interval ‘1 second’ * 900 → 00:15:00
interval ‘1 day’ * 21 → 21 days
interval ‘1 hour’ * 3.5 → 03:30:00
interval / double precision → interval
Делит интервал на скалярное значение
interval ‘1 hour’ / 1.5 → 00:40:00
Таблица 9.32. Функции даты/времени
age ( timestamp , timestamp ) → interval
Вычитает аргументы и выдаёт « символический » результат с годами и месяцами, а не просто днями
age(timestamp ‘2001-04-10’, timestamp ‘1957-06-13’) → 43 years 9 mons 27 days (43 года 9 месяцев 27 дней)
age ( timestamp ) → interval
Вычитает аргумент из current_date (полночь текущего дня)
age(timestamp ‘1957-06-13’) → 62 years 6 mons 10 days (62 года 6 месяцев 10 дней)
clock_timestamp ( ) → timestamp with time zone
Текущая дата и время (меняется в процессе выполнения операторов); см. Подраздел 9.9.4
clock_timestamp() → 2019-12-23 14:39:53.662522-05
current_date → 2019-12-23
current_time → time with time zone
Текущее время суток; см. Подраздел 9.9.4
current_time → 14:39:53.662522-05
current_time ( integer ) → time with time zone
Текущее время суток (с ограниченной точностью); см. Подраздел 9.9.4
current_time(2) → 14:39:53.66-05
current_timestamp → timestamp with time zone
Текущая дата и время (на момент начала транзакции); см. Подраздел 9.9.4
current_timestamp → 2019-12-23 14:39:53.662522-05
current_timestamp ( integer ) → timestamp with time zone
Текущие дата и время (на момент начала транзакции; с ограниченной точностью); см. Подраздел 9.9.4
current_timestamp(0) → 2019-12-23 14:39:53-05
date_part ( text , timestamp ) → double precision
Возвращает поле даты/времени (равнозначно extract ); см. Подраздел 9.9.1
date_part(‘hour’, timestamp ‘2001-02-16 20:38:40’) → 20
date_part ( text , interval ) → double precision
Возвращает поле интервала (равнозначно extract ); см. Подраздел 9.9.1
date_part(‘month’, interval ‘2 years 3 months’) → 3
date_trunc ( text , timestamp ) → timestamp
Отсекает компоненты даты до заданной точности; см. Подраздел 9.9.2
date_trunc(‘hour’, timestamp ‘2001-02-16 20:38:40’) → 2001-02-16 20:00:00
date_trunc ( text , timestamp with time zone , text ) → timestamp with time zone
Отсекает компоненты даты до заданной точности в указанном часовом поясе; см. Подраздел 9.9.2
date_trunc(‘day’, timestamptz ‘2001-02-16 20:38:40+00’, ‘Australia/Sydney’) → 2001-02-16 13:00:00+00
date_trunc ( text , interval ) → interval
Отсекает компоненты даты до заданной точности; см. Подраздел 9.9.2
date_trunc(‘hour’, interval ‘2 days 3 hours 40 minutes’) → 2 days 03:00:00
extract ( field from timestamp ) → double precision
Возвращает поле даты/времени; см. Подраздел 9.9.1
extract(hour from timestamp ‘2001-02-16 20:38:40’) → 20
extract ( field from interval ) → double precision
Возвращает поле интервала; см. Подраздел 9.9.1
extract(month from interval ‘2 years 3 months’) → 3
isfinite ( date ) → boolean
Проверяет конечность даты (её отличие от +/-бесконечности)
isfinite(date ‘2001-02-16’) → true
isfinite ( timestamp ) → boolean
Проверяет конечность времени (его отличие от +/-бесконечности)
isfinite(timestamp ‘infinity’) → false
isfinite ( interval ) → boolean
Проверяет конечность интервала (в настоящее время все интервалы конечны)
isfinite(interval ‘4 hours’) → true
justify_days ( interval ) → interval
Преобразует интервал так, что каждый 30-дневный период считается одним месяцем
justify_days(interval ’35 days’) → 1 mon 5 days (1 месяц 5 дней)
justify_hours ( interval ) → interval
Преобразует интервал так, что каждый 24-часовой период считается одним днём
justify_hours(interval ’27 hours’) → 1 day 03:00:00 (1 день 03:00:00)
justify_interval ( interval ) → interval
Преобразует интервал с применением justify_days и justify_hours и дополнительно корректирует знаки
justify_interval(interval ‘1 mon -1 hour’) → 29 days 23:00:00 (29 дней 23:00:00)
Текущее время суток; см. Подраздел 9.9.4
localtime → 14:39:53.662522
localtime ( integer ) → time
Текущее время суток (с ограниченной точностью); см. Подраздел 9.9.4
localtime(0) → 14:39:53
Текущая дата и время (на момент начала транзакции); см. Подраздел 9.9.4
localtimestamp → 2019-12-23 14:39:53.662522
localtimestamp ( integer ) → timestamp
Текущие дата и время (на момент начала транзакции; с ограниченной точностью); см. Подраздел 9.9.4
localtimestamp(2) → 2019-12-23 14:39:53.66
make_date ( year int , month int , day int ) → date
Образует дату из полей: year (год), month (месяц) и day (день)
make_date(2013, 7, 15) → 2013-07-15
make_interval ( [ years int [ , months int [ , weeks int [ , days int [ , hours int [ , mins int [ , secs double precision ] ] ] ] ] ] ] ) → interval
Образует интервал из полей: years (годы), months (месяцы), weeks (недели), days (дни), hours (часы), minutes (минуты) и secs (секунды), каждое из которых по умолчанию считается равным нулю.
make_interval(days => 10) → 10 days
make_time ( hour int , min int , sec double precision ) → time
Образует время из полей: hour (час), minute (минута) и sec (секунда)
make_time(8, 15, 23.5) → 08:15:23.5
make_timestamp ( year int , month int , day int , hour int , min int , sec double precision ) → timestamp
Образует дату и время из полей: year (год), month (месяц), day (день), hour (час), minute (минута) и sec (секунда)
make_timestamp(2013, 7, 15, 8, 15, 23.5) → 2013-07-15 08:15:23.5
make_timestamptz ( year int , month int , day int , hour int , min int , sec double precision [ , timezone text ] ) → timestamp with time zone
Образует дату и время с часовым поясом из полей: year (год), month (месяц), day (день), hour (час), minute (минута) и sec (секунда). Если параметр timezone (часовой пояс) не указан, используется текущий часовой пояс.
make_timestamptz(2013, 7, 15, 8, 15, 23.5) → 2013-07-15 08:15:23.5+01
now ( ) → timestamp with time zone
Текущая дата и время (на момент начала транзакции); см. Подраздел 9.9.4
now() → 2019-12-23 14:39:53.662522-05
statement_timestamp ( ) → timestamp with time zone
Текущая дата и время (на момент начала текущего оператора); см. Подраздел 9.9.4
statement_timestamp() → 2019-12-23 14:39:53.662522-05
Текущая дата и время (как clock_timestamp , но в виде строки типа text ); см. Подраздел 9.9.4
timeofday() → Mon Dec 23 14:39:53.662522 2019 EST
transaction_timestamp ( ) → timestamp with time zone
Текущая дата и время (на момент начала транзакции); см. Подраздел 9.9.4
transaction_timestamp() → 2019-12-23 14:39:53.662522-05
to_timestamp ( double precision ) → timestamp with time zone
Преобразует время эпохи Unix (число секунд с 1970-01-01 00:00:00+00) в дату/время с часовым поясом
to_timestamp(1284352323) → 2010-09-13 04:32:03+00
В дополнение к этим функциям поддерживается SQL-оператор OVERLAPS :
Его результатом будет true, когда два периода времени (определённые своими границами) пересекаются, и false в противном случае. Границы периода можно задать либо в виде пары дат, времени или дат со временем, либо как дату, время (или дату со временем) c интервалом. Когда указывается пара значений, первым может быть и начало, и конец периода: OVERLAPS автоматически считает началом периода меньшее значение. Периоды времени считаются наполовину открытыми, т. е. начало время конец , если только начало и конец не равны — в этом случае период представляет один момент времени. Это означает, например, что два периода, имеющие только общую границу, не будут считаться пересекающимися.
При добавлении к значению типа timestamp with time zone значения interval (или при вычитании из него interval ), поле дней в этой дате увеличивается (или уменьшается) на указанное число суток, а время суток остаётся неизменным. При пересечении границы перехода на летнее время (если в часовом поясе текущего сеанса производится этот переход) это означает, что interval ‘1 day’ и interval ’24 hours’ не обязательно будут равны. Например, в часовом поясе America/Denver :
Эта разница объясняется тем, что 2005-04-03 02:00 в часовом поясе America/Denver произошёл переход на летнее время.
Обратите внимание на возможную неоднозначность в поле months в результате функции age , вызванную тем, что число дней в разных месяцах неодинаково. Вычисляя оставшиеся дни месяца, PostgreSQL рассматривает месяц меньшей из двух дат. Например, результатом age(‘2004-06-01’, ‘2004-04-30’) будет 1 mon 1 day , так как в апреле 30 дней, а то же выражение с датой 30 мая выдаст 1 mon 2 days , так как в мае 31 день.
Вычитание дат и дат со временем также может быть нетривиальной операцией. Один принципиально простой способ выполнить такое вычисление — преобразовать каждое значение в количество секунд, используя EXTRACT(EPOCH FROM . ) , а затем найти разницу результатов; при этом будет получено число секунд между двумя датами. При этом будет учтено неодинаковое число дней в месяцах, изменения часовых поясов и переходы на летнее время. При вычитании дат или дат со временем с помощью оператора « — » выдаётся число дней (по 24 часа) и часов/минут/секунд между данными значениями, с учётом тех же факторов. Функция age возвращает число лет, месяцев, дней и часов/минут/секунд, выполняя вычитание по полям, а затем пересчитывая отрицательные значения. Различие этих подходов иллюстрируют следующие запросы. Показанные результаты были получены для часового пояса ‘US/Eastern’ ; между двумя заданными датами произошёл переход на летнее время:
9.9.1. EXTRACT , date_part
Функция extract получает из значений даты/времени поля, такие как год или час. Здесь источник — значение типа timestamp , time или interval . (Выражения типа date приводятся к типу timestamp , так что допускается и этот тип.) Указанное поле представляет собой идентификатор, по которому из источника выбирается заданное поле. Функция extract возвращает значения типа double precision . Допустимые поля:
Первый век начался 0001-01-01 00:00:00, хотя люди в то время и не считали так. Это определение распространяется на все страны с григорианским календарём. Века с номером 0 не было; считается, что 1 наступил после -1. Если такое положение вещей вас не устраивает, направляйте жалобы по адресу: Ватикан, Собор Святого Петра, Папе. day
Для значений timestamp это день месяца (1–31); для значений interval — число дней decade
Год, делённый на 10 dow
День недели, считая с воскресенья ( 0 ) до субботы ( 6 )
Заметьте, что в extract дни недели нумеруются не так, как в функции to_char(. ‘D’) . doy
День года (1–365/366) epoch
Для значений timestamp with time zone это число секунд с 1970-01-01 00:00:00 UTC (отрицательное для предшествующего времени); для значений date и timestamp — номинальное число секунд с 1970-01-01 00:00:00 без учёта часового пояса, переходов на летнее время и т. п.; для значений interval — общее количество секунд в интервале
Преобразовать время эпохи назад, в значение timestamp with time zone , с помощью to_timestamp можно так:
Имейте в виду, что применяя to_timestamp к времени эпохи, извлечённому из значения date или timestamp , можно получить не вполне ожидаемый результат: эта функция подразумевает, что изначальное значение задано в часовом поясе UTC, но это может быть не так. hour
День недели, считая с понедельника ( 1 ) до воскресенья ( 7 )
Результат отличается от dow только для воскресенья. Такая нумерация соответствует ISO 8601. isoyear
Этого поля не было в PostgreSQL до версии 8.3. julian
Юлианская дата, соответствующая дате или дате/времени (для интервала не определена). Значение будет дробным, если заданное время отличается от начала суток по местному времени. За дополнительной информацией обратитесь к Разделу B.7. microseconds
Значение секунд с дробной частью, умноженное на 1 000 000; заметьте, что оно включает и целые секунды millennium
Годы 20 века относятся ко второму тысячелетию. Третье тысячелетие началось 1 января 2001 г. milliseconds
Значение секунд с дробной частью, умноженное на 1 000; заметьте, что оно включает и целые секунды. minute
Минуты (0–59) month
Для значений timestamp это номер месяца в году (1–12), а для interval — остаток от деления числа месяцев на 12 (0–11) quarter
Квартал (1–4), к которому относится дата second
Секунды, включая дробную часть timezone
Смещение часового пояса от UTC, представленное в секундах. Положительные значения соответствуют часовым поясам к востоку от UTC, а отрицательные — к западу. (Строго говоря, в PostgreSQL используется не UTC, так как секунды координации не учитываются.) timezone_hour
Поле часов в смещении часового пояса timezone_minute
Поле минут в смещении часового пояса week
В системе нумерации недель ISO первые числа января могут относиться к 52-ой или 53-ей неделе предыдущего года, а последние числа декабря — к первой неделе следующего года. Например, 2005-01-01 относится к 53-ей неделе 2004 г., а 2006-01-01 — к 52-ей неделе 2005 г., тогда как 2012-12-31 включается в первую неделю 2013 г. Поэтому для получения согласованных результатов рекомендуется использовать поле isoyear в паре с week . year
Поле года. Учтите, что года 0 не было, и это следует иметь в виду, вычитая из годов нашей эры годы до нашей эры.
Примечание
С аргументом +/-бесконечность extract возвращает +/-бесконечность для монотонно увеличивающихся полей ( epoch , julian , year , isoyear , decade , century и millennium ). Для других полей возвращается NULL. До версии 9.6 PostgreSQL возвращал ноль для всех случаев с бесконечными аргументами.
Функция extract в основном предназначена для вычислительных целей. Функции форматирования даты/времени описаны в Разделе 9.8.
Функция date_part эмулирует традиционный для Ingres эквивалент стандартной SQL -функции extract :
Заметьте, что здесь параметр поле должен быть строковым значением, а не именем. Функция date_part воспринимает те же поля, что и extract .
9.9.2. date_trunc
Функция date_trunc работает подобно trunc для чисел.
Здесь значение — выражение типа timestamp , timestamp with time zone или interval . (Значения типов date и time автоматически приводятся к типам timestamp и interval , соответственно.) Параметр поле определяет, до какой точности обрезать переданное значение. В возвращаемом значении, имеющем также тип timestamp , timestamp with time zone или interval , все поля, менее значимые, чем заданное, будут равны нулю (или одному, если это номер дня или месяца).
Параметр поле может принимать следующие значения:
microseconds |
milliseconds |
second |
minute |
hour |
day |
week |
month |
quarter |
year |
decade |
century |
millennium |
Когда входное значение имеет тип timestamp with time zone , оно обрезается с учётом заданного часового пояса; например, если обрезать значение до поля day (день), в результате будет получена полночь в этом часовом поясе. По умолчанию входное значение обрезается с учётом параметра TimeZone, но дополнительный аргумент часовой_пояс позволяет выбрать и другой пояс. Название часового пояса может задаваться любым из способов, описанных в Подразделе 8.5.3.
Часовой пояс нельзя задать для значений типа timestamp without time zone или interval . Такие значения всегда воспринимаются как есть.
Несколько примеров (в предположении, что выбран часовой пояс America/New_York ):
9.9.3. AT TIME ZONE
Оператор AT TIME ZONE преобразует дату/время без часового пояса в дату/время с часовым поясом и обратно, а также пересчитывает значения time with time zone для различных часовых поясов. Его вариации показаны в Таблице 9.33.
Таблица 9.33. Разновидности AT TIME ZONE
timestamp without time zone AT TIME ZONE часовой_пояс → timestamp with time zone
Переводит значение даты/времени без часового пояса в дату/время с часовым поясом, в предположении, что входное значение задано в указанном поясе.
timestamp ‘2001-02-16 20:38:40’ at time zone ‘America/Denver’ → 2001-02-17 03:38:40+00
timestamp with time zone AT TIME ZONE часовой_пояс → timestamp without time zone
Переводит значение даты/времени с часовым поясом в дату/время без часового пояса, которое соответствует входному значению в указанном поясе.
timestamp with time zone ‘2001-02-16 20:38:40-05’ at time zone ‘America/Denver’ → 2001-02-16 18:38:40
time with time zone AT TIME ZONE часовой_пояс → time with time zone
Переводит значение времени с часовым поясом в другой часовой пояс. Так как время задаётся без даты, в расчёте используется действующее в данный момент смещение указанного часового пояса от UTC.
time with time zone ’05:34:17-05′ at time zone ‘UTC’ → 10:34:17+00
В этих выражениях желаемый часовой_пояс можно задать либо в виде текстовой строки (например, ‘America/Los_Angeles’ ), либо как интервал (например, INTERVAL ‘-08:00’ ). В первом случае название часового пояса можно указать любым из способов, описанных в Подразделе 8.5.3. Вариант с интервалом полезен, только если для часового пояса смещение от UTC всегда постоянно, что на практике встречается нечасто.
Примеры (в предположении, что параметр TimeZone имеет значение America/Los_Angeles ):
В первом примере для значения, заданного без часового пояса, указывается часовой пояс и полученное время выводится в текущем часовом поясе (заданном параметром TimeZone ). Во втором примере значение времени смещается в заданный часовой пояс и выдаётся без указания часового пояса. Этот вариант позволяет хранить и выводить значения с часовым поясом, отличным от текущего. В третьем примере время в часовом поясе Токио пересчитывается для часового пояса Чикаго.
Функция timezone ( часовой_пояс , время ) равнозначна SQL-совместимой конструкции время AT TIME ZONE часовой_пояс .
9.9.4. Текущая дата/время
PostgreSQL предоставляет набор функций, результат которых зависит от текущей даты и времени. Все следующие функции соответствуют стандарту SQL и возвращают значения, отражающие время начала текущей транзакции:
CURRENT_TIME и CURRENT_TIMESTAMP возвращают время с часовым поясом. В результатах LOCALTIME и LOCALTIMESTAMP нет информации о часовом поясе.
CURRENT_TIME , CURRENT_TIMESTAMP , LOCALTIME и LOCALTIMESTAMP могут принимать необязательный параметр точности, определяющий, до какого знака после запятой следует округлять поле секунд. Если этот параметр отсутствует, результат будет иметь максимально возможную точность.
Так как эти функции возвращают время начала текущей транзакции, во время транзакции эти значения не меняются. Это считается не ошибкой, а особенностью реализации: цель такого поведения в том, чтобы в одной транзакции « текущее » время было одинаковым и для разных изменений в одной транзакций записывалась одна отметка времени.
Примечание
В других СУБД эти значения могут изменяться чаще.
В PostgreSQL есть также функции, возвращающие время начала текущего оператора, а также текущее время в момент вызова функции. Таким образом, в PostgreSQL есть следующие функции, не описанные в стандарте SQL:
Функция transaction_timestamp() равнозначна конструкции CURRENT_TIMESTAMP , но в её названии явно отражено, что она возвращает. Функция statement_timestamp() возвращает время начала текущего оператора (более точно, время получения последнего командного сообщения от клиента). Функции statement_timestamp() и transaction_timestamp() возвращают одно и то же значение в первой команде транзакции, но в последующих их показания будут расходиться. Функция clock_timestamp() возвращает фактическое текущее время, так что её значение меняется в рамках одной команды SQL. Функция timeofday() существует в PostgreSQL по историческим причинам и, подобно clock_timestamp() , она возвращает фактическое текущее время, но представленное в виде форматированной строки типа text , а не значения timestamp with time zone . Функция now() — традиционный для PostgreSQL эквивалент функции transaction_timestamp() .
Все типы даты/времени также принимают специальное буквальное значение now , подразумевающее текущую дату и время (тоже на момент начала транзакции). Таким образом, результат следующих трёх операторов будет одинаковым:
Подсказка
Не используйте третью форму для указания значения, которое будет вычисляться позднее, например, в предложении DEFAULT для столбца таблицы. Система преобразует now в значение timestamp в момент разбора константы, поэтому когда будет вставляться такое значение по умолчанию, в соответствующем столбце окажется время создания таблицы! Первые две формы будут вычисляться, только когда значение по умолчанию потребуется, так как это вызовы функции. Поэтому они дадут желаемый результат при добавлении строки в таблицу. (См. также Подраздел 8.5.1.4.)
9.9.5. Задержка выполнения
В случае необходимости выполнение серверного процесса можно приостановить, используя следующие функции:
Функция pg_sleep переводит процесс текущего сеанса в спящее состояние на указанное число секунд (это число может быть дробным). В дополнение к ней для удобства добавлены две функции: pg_sleep_for , принимающая время задержки в типе interval , и pg_sleep_until , позволяющая задать определённое время выхода из спящего состояния. Например:
Примечание
Действительное разрешение интервала задержки зависит от платформы; обычно это 0.01. Фактическая длительность задержки не будет меньше указанного времени, но может быть больше, в зависимости, например от нагрузки на сервер. В частности, не гарантируется, что pg_sleep_until проснётся именно в указанное время, но она точно не проснётся раньше.
Предупреждение
Прежде чем вызывать pg_sleep или её вариации, убедитесь в том, что в текущем сеансе нет ненужных блокировок. В противном случае в состояние ожидания могут перейти и другие сеансы, так что это отразится на системе в целом.