EXTRACT, date_partdate_truncdate_binAT TIME ZONE и AT LOCAL
Таблица 2.6.33 в таблице приведены доступные функции для обработки значений даты и времени; подробные сведения представлены в следующих подразделах. Таблица 2.6.32 демонстрирует работу основных арифметических операторов (+,
*, и т. д.). Описание функций форматирования приведено в
Раздел 2.6.8. Необходимо предварительно ознакомиться со сведениями о типах данных даты и времени в Раздел 2.5.5.
Кроме того, стандартные операторы сравнения, перечисленные в
Таблица 2.6.1 доступны для типов данных даты и времени. Значения даты и меток времени (timestamp, с часовым поясом или без него) сопоставимы между собой, в то время как значения времени (time, с часовым поясом или без него) и интервалы (interval) могут сравниваться только со значениями того же типа данных. При сравнении значения типа timestamp without time zone со значением типа timestamp with time zone предполагается, что первое значение задано в часовом поясе, указанном в TimeZone параметре конфигурации, и оно приводится к формату UTC для сравнения со вторым значением (которое уже хранится в формате UTC). Аналогичным образом предполагается, что значение даты соответствует полуночи в TimeZone часовом поясе при сравнении этого значения с типом timestamp.
Все описанные ниже функции и операторы, принимающие в качестве аргументов time или timestamp
входные данные фактически представлены в двух вариантах: один из них принимает значение время с часовым поясом или отметка времени
с часовым поясом, а другой принимает значение время без часового пояса или отметка времени без часового пояса.
Для краткости эти варианты не приводятся по отдельности. Кроме того, многие
+ и * операторы образуют коммутативные пары (например, оба оператора date + integer
и integer + date); в списке представлен
только один из каждой такой пары.
Таблица 2.6.32. Операторы даты и времени
Оператор Описание Примеры |
|---|
Добавление количества дней к дате
|
Добавление интервала к дате
|
Добавление времени суток к дате
|
Сложение интервалов
|
Сложение метки времени timestamp с интервалом interval
|
Сложение значения времени time с интервалом interval
|
Унарный минус для интервала interval
|
Вычитание дат date для получения количества прошедших дней
|
Вычитание целого числа дней из даты date
|
Вычитание интервала interval из даты date
|
Вычитание значений времени time
|
Вычитание интервала interval из времени time
|
Вычитание интервала (interval) из временной метки (timestamp)
|
Вычитание интервалов
|
Вычитание временных меток (с преобразованием 24-часовых интервалов в дни,
аналогично функции
|
Умножение интервала на скалярное значение
|
Деление интервала на скалярное значение
|
Таблица 2.6.33. Функции даты и времени
Функция Описание Примеры |
|---|
Выполняет вычитание аргументов, формируя «символический» результат, в котором используются значения лет и месяцев вместо только лишь дней
|
Вычитает аргумент из текущей даты
|
Текущие дата и время (значение изменяется в процессе выполнения инструкции); см. Раздел 2.6.9.5
|
|
Текущая дата; см. Раздел 2.6.9.5
|
Текущее время суток; см. Раздел 2.6.9.5
|
Текущее время суток с ограниченной точностью; см. Раздел 2.6.9.5
|
Текущие дата и время (на момент начала текущей транзакции); см. Раздел 2.6.9.5
|
Текущие дата и время (момент начала текущей транзакции) с ограниченной точностью; см. Раздел 2.6.9.5
|
Добавить
|
Группировка входного значения по заданным интервалам с выравниванием по указанному началу отсчета; см. Раздел 2.6.9.3
|
Получение подполя метки времени (эквивалентно
|
Получение подполя интервала (эквивалентно функции
|
Вычитает значение типа
|
Усекает значение до указанной точности; см. подраздел Раздел 2.6.9.2
|
Усекает значение до указанной точности в указанном часовом поясе; см. подраздел Раздел 2.6.9.2
|
Усекает значение до указанной точности; см. подраздел Раздел 2.6.9.2
|
Получение подполя метки времени; см. подраздел Раздел 2.6.9.1
|
Извлечение части интервала; см. Раздел 2.6.9.1
|
|
Проверка даты на конечность (отсутствие значения +/-бесконечность)
|
Проверка метки времени на конечность (отсутствие значения +/-бесконечность)
|
Проверка интервала на конечность (отсутствие значения +/-бесконечность)
|
Корректировка интервала с преобразованием 30-дневных периодов в полные месяцы
|
Корректировка интервала с преобразованием 24-часовых периодов в полные дни
|
Корректировка интервала с использованием функции
|
|
Текущее время суток; см. Раздел 2.6.9.5
|
Текущее время суток с ограниченной точностью; см. Раздел 2.6.9.5
|
|
Текущие дата и время (на момент начала текущей транзакции); см. Раздел 2.6.9.5
|
Текущие дата и время (начало текущей транзакции) с ограниченной точностью; см. Раздел 2.6.9.5
|
Формирование даты на основе полей года, месяца и дня (отрицательные значения года соответствуют годам до н. э.)
|
Формирует интервал (тип interval) на основе значений лет, месяцев, недель, дней, часов, минут и секунд; для любого из этих полей значением по умолчанию является ноль
|
Формирует значение времени (тип time) на основе значений часа, минуты и секунд
|
Формирует метку времени (тип timestamp) на основе значений года, месяца, дня, часа, минуты и секунд (отрицательные значения года соответствуют годам до н. э.)
|
Формирует метку времени с часовым поясом (тип timestamp with time zone) на основе значений года, месяца, дня, часа, минуты
и секунд (отрицательные значения года соответствуют датам до н. э.).
Если
|
Текущие дата и время (на момент начала текущей транзакции); см. Раздел 2.6.9.5
|
Текущие дата и время (момент начала выполнения текущей инструкции); см. Раздел 2.6.9.5
|
|
Текущие дата и время
(аналогично функции
|
Текущие дата и время (на момент начала текущей транзакции); см. Раздел 2.6.9.5
|
Преобразование значения Unix-эпохи (количество секунд, прошедших с 1970-01-01 00:00:00+00) в timestamp with time zone
|
В дополнение к этим функциям язык SQL OVERLAPS поддерживается оператор:
(start1,end1) OVERLAPS (start2,end2) (start1,length1) OVERLAPS (start2,length2)
Данное выражение возвращает логическое значение true, если два периода времени, определенные их граничными точками, перекрываются, и false, если перекрытия нет. Граничные точки могут быть указаны в виде пар дат, значений времени или меток времени; либо как дата, время или метка времени с последующим интервалом (interval). Если указана пара значений, первым может быть записано как начало, так и конец периода; OVERLAPS язык SQL автоматически выбирает меньшее значение из пары в качестве начала периода. Каждый период времени рассматривается как представляющий собой полуоткрытый интервал start <=
время < end, за исключением случаев, когда
start и end равны; в этой ситуации он представляет собой один этот момент времени. Это означает, например, что два временных периода, имеющие только одну общую конечную точку, не перекрываются.
SELECT (DATE '2001-02-16', DATE '2001-12-21') OVERLAPS
(DATE '2001-10-30', DATE '2002-10-30');
Результат: true
SELECT (DATE '2001-02-16', INTERVAL '100 days') OVERLAPS
(DATE '2001-10-30', DATE '2002-10-30');
Результат: false
SELECT (DATE '2001-10-29', DATE '2001-10-30') OVERLAPS
(DATE '2001-10-30', DATE '2001-10-31');
Результат: false
SELECT (DATE '2001-10-30', DATE '2001-10-30') OVERLAPS
(DATE '2001-10-30', DATE '2001-10-31');
Результат: true
При прибавлении значения типа interval к значению типа (или вычитании значения типа
interval из значения типа) timestamp
или timestamp with time zone значения, поля месяцев, дней и микросекунд interval значения обрабатываются последовательно. Сначала на основании ненулевого значения поля месяцев дата временной метки увеличивается или уменьшается на указанное количество месяцев. При этом число месяца сохраняется, если оно не превышает количество дней в новом месяце; в противном случае результатом будет последний день данного месяца. (Например, при добавлении 1 месяца к 31 марта получается 30 апреля, а при добавлении 2 месяцев к 31 марта — 31 мая.) Затем на основании значения поля дней дата временной метки увеличивается или уменьшается на указанное количество дней. На обоих этих этапах локальное время суток остается неизменным. Наконец, если поле микросекунд содержит ненулевое значение, оно прибавляется или вычитается без изменений. При выполнении арифметических операций над timestamp with time zone значением в
часовом поясе с поддержкой перехода на летнее время (DST), это означает, что прибавление или вычитание
(например) интервала '1 day' не обязательно приводит к тому же результату, что и прибавление или вычитание interval '24
hours'. Например, если для часового пояса сеанса установлено значение America/Denver:
SELECT timestamp with time zone '2005-04-02 12:00:00-07' + interval '1 day'; Результат:2005-04-03 12:00:00-06SELECT timestamp with time zone '2005-04-02 12:00:00-07' + interval '24 hours'; Результат:2005-04-03 13:00:00-06
Это происходит по причине того, что один час был пропущен вследствие перехода на летнее время в 2005-04-03 02:00:00 в часовом поясе
America/Denver.
Следует учитывать возможную неоднозначность в месяцы поле, возвращаемом функцией
age так как различные месяцы имеют разное количество дней. Digital Q.DataBaseАлгоритм использует месяц из более ранней из двух дат при вычислении неполных месяцев. Например,
age('2004-06-01', '2004-04-30') использует апрель, что дает результат
1 mon 1 day, тогда как использование мая дало бы результат 1 mon 2
days поскольку в мае 31 день, тогда как в апреле — только 30.
Операция вычитания дат и меток времени также может быть сложной. Одним из концептуально простых способов выполнения вычитания является преобразование каждого значения в количество секунд с помощью функции EXTRACT(EPOCH FROM ...), с последующим вычитанием
полученных результатов; данная операция вычисляет
количество секунд между двумя значениями. При таком подходе учитывается количество дней в каждом месяце, смещение часовых поясов и переход на летнее время. Вычитание значений типов date или timestamp
при помощи «-» оператора -
возвращает количество дней (кратных 24 часам), а также часов, минут и секунд
между значениями с учетом аналогичных корректировок. Функция age
возвращает разницу в годах, месяцах, днях, часах, минутах и секундах, выполняя вычитание по каждому полю отдельно с последующей корректировкой отрицательных значений. Различия между этими подходами иллюстрируют следующие запросы. Приведенные примеры результатов были получены при следующих настройках: timezone
= 'US/Eastern'; между двумя используемыми датами происходит переход на летнее время:
SELECT EXTRACT(EPOCH FROM timestamptz '2013-07-01 12:00:00') -
EXTRACT(EPOCH FROM timestamptz '2013-03-01 12:00:00');
Результат: 10537200.000000
SELECT (EXTRACT(EPOCH FROM timestamptz '2013-07-01 12:00:00') -
EXTRACT(EPOCH FROM timestamptz '2013-03-01 12:00:00'))
/ 60 / 60 / 24;
Результат: 121.9583333333333333
SELECT timestamptz '2013-07-01 12:00:00' - timestamptz '2013-03-01 12:00:00';
Результат: 121 день 23:00:00
SELECT age(timestamptz '2013-07-01 12:00:00', timestamptz '2013-03-01 12:00:00');
Результат: 4 месяца
EXTRACT, date_part #EXTRACT(fieldFROMsource)
Данный extract функция позволяет извлекать такие поля, как год или час, из значений даты и времени.
source должно быть выражением значения
типа timestamp, date, time,
или interval. (Значения типов timestamp и time могут быть как с часовым поясом, так и без него.)
field представляет собой идентификатор или строку, определяющую поле для извлечения из исходного значения. Не все поля допустимы для каждого входного типа данных; например, поля
меньше суток нельзя извлечь из типа date, тогда как
поля размером в сутки и более нельзя извлечь из типа time.
Данная функция extract возвращает значения типа
numeric.
Допустимыми именами полей являются:
century
Век; для interval значений поле года
делится на 100
SELECT EXTRACT(CENTURY FROM TIMESTAMP '2000-12-16 12:21:13'); Результат:20SELECT EXTRACT(CENTURY FROM TIMESTAMP '2001-02-16 20:38:40'); Результат:21SELECT EXTRACT(CENTURY FROM DATE '0001-01-01 AD'); Результат:1SELECT EXTRACT(CENTURY FROM DATE '0001-12-31 BC'); Результат:-1SELECT EXTRACT(CENTURY FROM INTERVAL '2001 years'); Результат:20
day
День месяца (от 1 до 31); для interval
значений — количество дней
SELECT EXTRACT(DAY FROM TIMESTAMP '2001-02-16 20:38:40'); Результат:16SELECT EXTRACT(DAY FROM INTERVAL '40 days 1 minute'); Результат:40
decadeЗначение поля года, делённое на 10
SELECT EXTRACT(DECADE FROM TIMESTAMP '2001-02-16 20:38:40');
Результат: 200
dow
День недели, где воскресенью соответствует значение (0) к
Суббота (6)
SELECT EXTRACT(DOW FROM TIMESTAMP '2001-02-16 20:38:40');
Результат: 5
Обратите внимание, что extractнумерация дней недели
отличается от аналогичного значения в to_char(...,
'D') функции.
doyДень года (1–365/366)
SELECT EXTRACT(DOY FROM TIMESTAMP '2001-02-16 20:38:40');
Результат: 47
epoch
Для timestamp with time zone значений,
количество секунд, прошедших с 1970-01-01 00:00:00 UTC (отрицательное значение для
меток времени, предшествующих этой дате);
в date и timestamp значений,
номинальное количество секунд, прошедших с 1970-01-01 00:00:00,
без учета часового пояса и правил перехода на летнее время;
в interval значений, общее количество
количество секунд в интервале
SELECT EXTRACT(EPOCH FROM TIMESTAMP WITH TIME ZONE '2001-02-16 20:38:40.12-08'); Результат:982384720.120000SELECT EXTRACT(EPOCH FROM TIMESTAMP '2001-02-16 20:38:40.12'); Результат:982355920.120000SELECT EXTRACT(EPOCH FROM INTERVAL '5 days 3 hours'); Результат:442800.000000
Значение epoch можно преобразовать обратно в timestamp with time zone
с to_timestamp:
SELECT to_timestamp(982384720.12);
Результат: 2001-02-17 04:38:40.12+00
Следует учитывать, что применение функции to_timestamp к значению epoch,
извлеченному из типа date или timestamp timestamp,
может привести к некорректному результату: фактически будет
предполагаться, что исходное значение было задано в UTC, что может
не соответствовать действительности.
часПоле часа (0–23 для меток времени, не ограничено для интервалов)
SELECT EXTRACT(HOUR FROM TIMESTAMP '2001-02-16 20:38:40');
Результат: 20
isodow
День недели, где понедельник (1) к
Воскресенье (7)
SELECT EXTRACT(ISODOW FROM TIMESTAMP '2001-02-18 20:38:40');
Результат: 7
Это значение идентично результату dow за исключением воскресенья. Здесь используется
соответствует ISO нумерация дней недели согласно стандарту ISO 8601.
isoyearДанный ISO год согласно системе нумерации недель ISO 8601, к которому относится указанная дата
SELECT EXTRACT(ISOYEAR FROM DATE '2006-01-01'); Результат:2005SELECT EXTRACT(ISOYEAR FROM DATE '2006-01-02'); Результат:2006
Каждый ISO год согласно системе нумерации недель ISO 8601 начинается с
понедельника той недели, на которую приходится 4 января. По этой причине в начале
января или в конце декабря номер ISO года ISO может
отличаться от номера года по григорианскому календарю. Дополнительную информацию см. в описании поля week
field for more information.
julianДанный Юлианская дата соответствующий дате или метке времени. Метки времени не соответствующие местной полночи, дают в результате дробное значение. См. Раздел 8.2.7 для получения дополнительной информации.
SELECT EXTRACT(JULIAN FROM DATE '2006-01-01'); Результат:2453737SELECT EXTRACT(JULIAN FROM TIMESTAMP '2006-01-01 12:00'); Результат:2453737.50000000000000000000
микросекундыЗначение поля секунд, включая дробную часть, умноженное на 1 000 000; обратите внимание, что оно включает полные секунды
SELECT EXTRACT(MICROSECONDS FROM TIME '17:12:28.5');
Результат: 28500000
тысячелетие
Тысячелетие; для interval значений поле года
деленное на 1000
SELECT EXTRACT(MILLENNIUM FROM TIMESTAMP '2001-02-16 20:38:40'); Результат:3SELECT EXTRACT(MILLENNIUM FROM INTERVAL '2001 years'); Результат:2
Годы в диапазоне 1900-х относятся ко второму тысячелетию. Третье тысячелетие началось 1 января 2001 года.
миллисекундыЗначение поля секунд, включая дробную часть, умноженное на 1000. Обратите внимание, что это значение включает полные секунды.
SELECT EXTRACT(MILLISECONDS FROM TIME '17:12:28.5');
Результат: 28500.000
минутаЗначение поля минут (0–59)
SELECT EXTRACT(MINUTE FROM TIMESTAMP '2001-02-16 20:38:40');
Результат: 38
month
Номер месяца в пределах года (1–12);
в interval значений, количество месяцев по модулю 12
(0–11)
SELECT EXTRACT(MONTH FROM TIMESTAMP '2001-02-16 20:38:40'); Результат:2SELECT EXTRACT(MONTH FROM INTERVAL '2 years 3 months'); Результат:3SELECT EXTRACT(MONTH FROM INTERVAL '2 years 13 months'); Результат:1
кварталКвартал года (1–4), к которому относится указанная дата
SELECT EXTRACT(QUARTER FROM TIMESTAMP '2001-02-16 20:38:40');
Результат: 1
secondПоле секунд, включая дробную часть секунд
SELECT EXTRACT(SECOND FROM TIMESTAMP '2001-02-16 20:38:40'); Результат:40.000000SELECT EXTRACT(SECOND FROM TIME '17:12:28.5'); Результат:28.500000
часовой поясСмещение часового пояса относительно UTC в секундах. Положительные значения соответствуют часовым поясам к востоку от UTC, а отрицательные — к западу от UTC. (Технически, Digital Q.DataBase не использует UTC, так как високосные секунды не поддерживаются.)
timezone_hourЧасовой компонент смещения часового пояса
timezone_minuteМинутный компонент смещения часового пояса
weekНомер ISO недели года согласно стандарту ISO 8601 года. По определению, недели ISO начинаются с понедельника, а первая неделя года включает в себя 4 января. Иными словами, первый четверг года всегда входит в неделю 1.
В системе нумерации недель ISO дни начала января могут относиться
даты относятся к 52-й или 53-й неделе предыдущего года, а
даты в конце декабря могут относиться к первой неделе следующего года.
Например, 2005-01-01 относится к 53-й неделе
2004 года, а 2006-01-01 относится к 52-й неделе
2005 года, тогда как 2012-12-31 относится к первой неделе 2013 года.
Для получения согласованных результатов рекомендуется использовать isoyear поле вместе с полем
week to get consistent results.
SELECT EXTRACT(WEEK FROM TIMESTAMP '2001-02-16 20:38:40');
Результат: 7
год
Поле YEAR (год). Необходимо учитывать, что года 0 ADне существует, поэтому операцию вычитания
BC лет из значения AD лет следует выполнять с осторожностью.
SELECT EXTRACT(YEAR FROM TIMESTAMP '2001-02-16 20:38:40');
Результат: 2001
При обработке значения interval ,
функция extract формирует значения полей, соответствующие интерпретации, которая используется функцией вывода интервалов (interval output function). Это
может привести к неожиданным результатам, если в качестве исходного используется ненормализованное
представление интервала, например:
SELECT INTERVAL '80 minutes'; Результат:01:20:00SELECT EXTRACT(MINUTES FROM INTERVAL '80 minutes'); Результат:20
Если входное значение равно +/-Infinity, extract возвращает
+/-Infinity для монотонно возрастающих полей (epoch,
julian, год, isoyear,
decade, century, и тысячелетие
для timestamp входных данных; epoch, час,
day, год, decade,
century, и тысячелетие для
interval входных данных).
Для остальных полей возвращается значение NULL. Digital Q.DataBase
в версиях до 9.6 во всех случаях бесконечных входных данных возвращалось значение ноль.
Данный extract функция в первую очередь предназначена для вычислительной обработки данных. Сведения о форматировании значений даты и времени для отображения приведены в описании Раздел 2.6.8.
Данный date_part функция реализована по образцу традиционной функции
Ingres эквивалентна функции
SQL-стандартная функция extract:
date_part('field', source)
Обратите внимание, что в данном случае field параметр должен представлять собой строковое значение, а не имя. Допустимые имена полей для функции
date_part совпадают с именами полей для функции
extract.
По историческим причинам функция date_part данная функция возвращает значения типа double precision. В определенных сценариях использования это может привести к
потере точности. Вместо этого использование функции extract
рекомендуется в качестве альтернативы.
SELECT date_part('day', TIMESTAMP '2001-02-16 20:38:40');
Результат: 16
SELECT date_part('hour', INTERVAL '4 hours 3 minutes');
Результат: 4
date_trunc #
Функция date_trunc концептуально
сходна с trunc функцией для числовых значений.
date_trunc(field,source[,time_zone])
source представляет собой выражение, имеющее значение типа
timestamp, timestamp with time zone,
или interval.
(Значения типа date и
time автоматически приводятся к типу timestamp или
interval, соответственно).
field определяет точность, с которой будет выполнено усечение входного значения. Возвращаемое значение также относится к типу
timestamp, timestamp with time zone,
или interval,
при этом для всех полей, менее значимых, чем
выбранное, устанавливается значение ноль (или единица для дня и месяца).
Допустимыми значениями для field являются:
microseconds |
milliseconds |
second |
minute |
hour |
day |
week |
month |
quarter |
year |
decade |
century |
millennium |
Если входное значение имеет тип timestamp with time zone,
усечение выполняется с учетом конкретного часового пояса;
например, усечение до day возвращает значение, соответствующее полночи в данном поясе. По умолчанию усечение выполняется относительно текущей настройки TimeZone , однако может быть
указан необязательный аргумент time_zone для указания другого часового пояса может быть передан дополнительный аргумент. Название часового пояса может быть задано
любым из способов, описанных в Раздел 2.5.5.3.
Указание часового пояса недопустимо при обработке timestamp without
time zone или interval входных данных. Эти значения всегда обрабатываются в исходном виде.
Примеры (при условии, что локальный часовой пояс — America/New_York):
SELECT date_trunc('hour', TIMESTAMP '2001-02-16 20:38:40');
Результат: 2001-02-16 20:00:00
SELECT date_trunc('year', TIMESTAMP '2001-02-16 20:38:40');
Результат: 2001-01-01 00:00:00
SELECT date_trunc('day', TIMESTAMP WITH TIME ZONE '2001-02-16 20:38:40+00');
Результат: 2001-02-16 00:00:00-05
SELECT date_trunc('day', TIMESTAMP WITH TIME ZONE '2001-02-16 20:38:40+00', 'Australia/Sydney');
Результат: 2001-02-16 08:00:00-05
SELECT date_trunc('hour', INTERVAL '3 days 02:47:33');
Результат: 3 days 02:00:00
date_bin #
Функция date_bin «группирует по интервалам» входное значение типа timestamp по заданному интервалу ( шаг)
с выравниванием по заданному началу отсчета.
date_bin(шаг,source,начало отсчета)
source представляет собой выражение, имеющее значение типа
timestamp или timestamp with time zone. (Значения
типа date автоматически приводятся к типу
timestamp.) шаг представляет собой выражение значения типа interval. Возвращаемое значение также имеет тип timestamp или timestamp with time zone,
и оно определяет начало интервала, в который
source помещается значение.
Примеры:
SELECT date_bin('15 minutes', TIMESTAMP '2020-02-11 15:44:17', TIMESTAMP '2001-01-01');
Результат: 2020-02-11 15:30:00
SELECT date_bin('15 minutes', TIMESTAMP '2020-02-11 15:44:17', TIMESTAMP '2001-01-01 00:02:30');
Результат: 2020-02-11 15:32:30
В случае использования полных единиц (1 минута, 1 час и т. д.) результат будет таким же, как и при аналогичном date_trunc вызове, однако различие заключается в
том, что date_bin позволяет выполнять усечение до произвольного интервала.
Данный шаг интервал должен быть больше нуля и не может содержать единицы измерения «месяц» или более крупные.
AT TIME ZONE и AT LOCAL #
Данный AT TIME ZONE оператор преобразует метку
времени без часового пояса в метку времени или из
метки времени с часовым поясом, и
время с часовым поясом значения для различных часовых
поясов. Таблица 2.6.34 показывает доступные
варианты.
Таблица 2.6.34. AT TIME ZONE и AT LOCAL Варианты
Оператор Описание Примеры |
|---|
Преобразует заданную метку времени без часового пояса в метку времени с часового пояса, принимая, что данное значение относится к указанному часовому поясу.
|
Преобразует заданную метку времени без часового пояса в
метку времени с текущего сеанса
|
Преобразует заданную метку времени с часового пояса в метку времени без часовой пояс в том виде, в каком время отображалось бы в этом поясе.
|
Преобразует заданную метку времени с часового пояса в
метку времени без часовой пояс в том виде, в каком время
отображаться с настройками текущего сеанса
|
Данное выражение преобразует заданное значение времени с из одного часового пояса в новое значение времени в другом часовом поясе. Так как дата не указана, используется смещение относительно UTC, актуальное на текущий момент для указанного целевого часового пояса.
|
Данное выражение преобразует заданное значение времени с из одного часового пояса в новое значение времени
в другом часовом поясе. Так как дата не указана, используется смещение относительно UTC, актуальное на текущий момент
смещение для текущего сеанса,
При условии, что для текущего сеанса
|
В этих выражениях требуемый часовой пояс поясом может быть
указан либо в виде текстового значения (например, 'America/Los_Angeles'),
либо в виде интервала (например, INTERVAL '-08:00').
В случае текстового аргумента имя часового пояса может быть указано любым из способов,
описанных в Раздел 2.5.5.3.
Использование интервала применимо только для часовых поясов с фиксированным смещением относительно
UTC, поэтому на практике такой вариант встречается редко.
Синтаксическая конструкция AT LOCAL может использоваться как сокращенная форма
AT TIME ZONE , где
locallocal представляет собой значение сеанса для
TimeZone значении.
Примеры (при условии, что текущая TimeZone настройка
установлена в America/Los_Angeles):
SELECT TIMESTAMP '2001-02-16 20:38:40' AT TIME ZONE 'America/Denver'; Результат:2001-02-16 19:38:40-08SELECT TIMESTAMP WITH TIME ZONE '2001-02-16 20:38:40-05' AT TIME ZONE 'America/Denver'; Результат:2001-02-16 18:38:40SELECT TIMESTAMP '2001-02-16 20:38:40' AT TIME ZONE 'Asia/Tokyo' AT TIME ZONE 'America/Chicago'; Результат:2001-02-16 05:38:40SELECT TIMESTAMP WITH TIME ZONE '2001-02-16 20:38:40-05' AT LOCAL; Результат:2001-02-16 17:38:40SELECT TIME WITH TIME ZONE '20:38:40-05' AT LOCAL; Результат:17:38:40
В первом примере часовой пояс добавляется к значению, в котором он отсутствует, а полученный результат отображается с использованием текущей TimeZone
настройки. Во втором примере значение типа timestamp with time zone смещается в указанный часовой пояс, после чего возвращается значение без часового пояса. Это позволяет хранить и отображать значения, отличные от установленных текущей
TimeZone настройки. В третьем примере время Токио преобразуется во время Чикаго. В четвертом примере значение типа timestamp with time zone смещается в часовой пояс, заданный в данный момент
TimeZone настройкой, и возвращается значение без часового пояса.
Пятый пример служит предостережением. В связи с тем, что с входным значением не связана конкретная дата, преобразование выполняется с использованием текущей даты сеанса. Следовательно, этот статический пример может выводить неверный результат в зависимости от времени года, в которое он просматривается, так как
'America/Los_Angeles' использует переход на летнее время.
Функция эквивалентно конструкции, соответствующей стандарту SQL
часовой пояс(поясом,
timestamp).
timestamp AT TIME ZONE
поясом
Функция эквивалентно конструкции, соответствующей стандарту SQL
часовой пояс(поясом,
время).
время AT TIME ZONE
поясом
Функция
эквивалентно конструкции, соответствующей стандарту SQL часовой пояс(timestamp).
timestamp
AT LOCAL
Функция
эквивалентно конструкции, соответствующей стандарту SQL часовой пояс(время).
время
AT LOCAL
Digital Q.DataBase предоставляет ряд функций, возвращающих значения, связанные с текущей датой и временем. Все эти функции стандарта SQL возвращают значения, основанные на времени начала текущей транзакции:
CURRENT_DATE CURRENT_TIME CURRENT_TIMESTAMP CURRENT_TIME(точность) CURRENT_TIMESTAMP(точность) LOCALTIME LOCALTIMESTAMP LOCALTIME(точность) LOCALTIMESTAMP(точность)
CURRENT_TIME и
CURRENT_TIMESTAMP возвращают значения с часовым поясом;
LOCALTIME и
LOCALTIMESTAMP возвращают значения без часового пояса.
CURRENT_TIME,
CURRENT_TIMESTAMP,
LOCALTIME, а
LOCALTIMESTAMP
может принимать необязательный параметр точности, согласно которому результат округляется до соответствующего количества знаков после запятой в поле секунд. При отсутствии параметра точности результат возвращается с максимально доступной точностью.
Некоторые примеры:
SELECT CURRENT_TIME; Результат:14:39:53.662522-05SELECT CURRENT_DATE; Результат:2019-12-23SELECT CURRENT_TIMESTAMP; Результат:2019-12-23 14:39:53.662522-05SELECT CURRENT_TIMESTAMP(2); Результат:2019-12-23 14:39:53.66-05SELECT LOCALTIMESTAMP; Результат:2019-12-23 14:39:53.662522
Поскольку данные функции возвращают время начала текущей транзакции, их значения не изменяются в ходе выполнения транзакции. Данное поведение считается функциональной особенностью: оно обеспечивает согласованное представление времени в рамках одной транзакции, «текущее значение» благодаря чему несколько изменений в одной и той же транзакции получают идентичную метку времени.
В других системах управления базами данных данные значения могут обновляться чаще.
Digital Q.DataBase также предусмотрены функции, возвращающие время начала выполнения текущего оператора, а также фактическое текущее время в момент вызова функции. Полный список функций времени, не входящих в стандарт SQL, включает:
transaction_timestamp() statement_timestamp() clock_timestamp() timeofday() now()
transaction_timestamp() эквивалентен конструкции
CURRENT_TIMESTAMP, однако её название более точно отражает
возвращаемый результат.
statement_timestamp() возвращает время начала выполнения текущей
инструкции (более точно — время получения последнего сообщения с командой
от клиентской части).
statement_timestamp() и transaction_timestamp()
возвращают одинаковое значение в процессе выполнения первой команды транзакции, но могут различаться при выполнении последующих команд.
clock_timestamp() возвращает фактическое текущее время, и следовательно, её значение изменяется даже в рамках выполнения одной команды языка SQL.
timeofday() является устаревшей
Digital Q.DataBase функцией. Как и функция
clock_timestamp(), она возвращает фактическое текущее время,
но в виде отформатированной text строки, а не timestamp
with time zone value.
now() является традиционным Digital Q.DataBase
эквивалентом функции transaction_timestamp().
Все типы данных даты и времени также принимают специальное литеральное значение
now для указания текущей даты и времени (которое также интерпретируется как время начала транзакции). Таким образом,
следующие три выражения возвращают один и тот же результат:
SELECT CURRENT_TIMESTAMP; SELECT now(); SELECT TIMESTAMP 'now'; -- но см. примечание ниже
Не используйте третью форму при указании значения, которое должно быть вычислено позже, например, в DEFAULT предложении для столбца таблицы.
Система преобразует now
в timestamp сразу после разбора константы, поэтому в тот момент,
когда потребуется значение по умолчанию,
будет использовано время создания таблицы! Первые две
формы не будут вычисляться до момента использования значения по умолчанию,
поскольку они представляют собой вызовы функций. Таким образом, они обеспечат требуемое поведение: подстановку времени вставки строки в качестве значения по умолчанию. (См. также раздел Раздел 2.5.5.1.4.)
Для приостановки выполнения процесса сервера доступны следующие функции:
pg_sleep (double precision) pg_sleep_for (interval) pg_sleep_until (timestamp with time zone)
pg_sleep переводит процесс текущего сеанса в состояние ожидания до тех пор, пока не истечет указанное количество секунд. Допускается указание задержек с дробными долями секунды.
pg_sleep_for является вспомогательной функцией, позволяющей задавать время задержки в формате interval.
pg_sleep_until является вспомогательной функцией для тех случаев, когда необходимо задать конкретное время возобновления работы. Например:
SELECT pg_sleep(1.5);
SELECT pg_sleep_for('5 minutes');
SELECT pg_sleep_until('tomorrow 03:00');
Фактическая точность интервала задержки зависит от платформы; типичное значение составляет 0.01 секунды. Фактическая задержка будет как минимум не меньше указанной. Этот интервал может быть увеличен в зависимости от таких факторов, как нагрузка на сервер. В частности, pg_sleep_until не гарантирует возобновление работы точно в указанное время, однако оно не произойдет раньше заданного момента.
При вызове функции убедитесь, что в текущем сеансе не удерживается больше блокировок, чем необходимо, pg_sleep или её вариантов. В противном случае другим сеансам может потребоваться ожидание завершения спящего процесса, что приведет к замедлению работы всей системы.