* Docs updated for date_trunc() and now(). * Minor fix. * Minor fix in en. Translation to Russian. * Minor link fixes. * Apply suggestions from code review Co-authored-by: BayoNet <da-daos@yandex.ru> * Updates * Minor fix * Minor updates for now() (en, ru). Co-authored-by: Olga Revyakina <revolg@yandex-team.ru> Co-authored-by: BayoNet <da-daos@yandex.ru>
23 KiB
toc_priority | toc_title |
---|---|
39 | Функции для работы с датами и временем |
Функции для работы с датами и временем
Поддержка часовых поясов
Все функции по работе с датой и временем, для которых это имеет смысл, могут принимать второй, необязательный аргумент - имя часового пояса. Пример: Asia/Yekaterinburg. В этом случае, они используют не локальный часовой пояс (по умолчанию), а указанный.
SELECT
toDateTime('2016-06-15 23:00:00') AS time,
toDate(time) AS date_local,
toDate(time, 'Asia/Yekaterinburg') AS date_yekat,
toString(time, 'US/Samoa') AS time_samoa
┌────────────────time─┬─date_local─┬─date_yekat─┬─time_samoa──────────┐
│ 2016-06-15 23:00:00 │ 2016-06-15 │ 2016-06-16 │ 2016-06-15 09:00:00 │
└─────────────────────┴────────────┴────────────┴─────────────────────┘
Поддерживаются только часовые пояса, отличающиеся от UTC на целое число часов.
toYear
Переводит дату или дату-с-временем в число типа UInt16, содержащее номер года (AD).
toMonth
Переводит дату или дату-с-временем в число типа UInt8, содержащее номер месяца (1-12).
toDayOfMonth
Переводит дату или дату-с-временем в число типа UInt8, содержащее номер дня в месяце (1-31).
toDayOfWeek
Переводит дату или дату-с-временем в число типа UInt8, содержащее номер дня в неделе (понедельник - 1, воскресенье - 7).
toHour
Переводит дату-с-временем в число типа UInt8, содержащее номер часа в сутках (0-23). Функция исходит из допущения, что перевод стрелок вперёд, если осуществляется, то на час, в два часа ночи, а перевод стрелок назад, если осуществляется, то на час, в три часа ночи (что, в общем, не верно - даже в Москве два раза перевод стрелок был осуществлён в другое время).
toMinute
Переводит дату-с-временем в число типа UInt8, содержащее номер минуты в часе (0-59).
toSecond
Переводит дату-с-временем в число типа UInt8, содержащее номер секунды в минуте (0-59). Секунды координации не учитываются.
toUnixTimestamp
For DateTime argument: converts value to its internal numeric representation (Unix Timestamp). For String argument: parse datetime from string according to the timezone (optional second argument, server timezone is used by default) and returns the corresponding unix timestamp. For Date argument: the behaviour is unspecified.
Syntax
toUnixTimestamp(datetime)
toUnixTimestamp(str, [timezone])
Returned value
- Returns the unix timestamp.
Type: UInt32
.
Example
Query:
SELECT toUnixTimestamp('2017-11-05 08:07:47', 'Asia/Tokyo') AS unix_timestamp
Result:
┌─unix_timestamp─┐
│ 1509836867 │
└────────────────┘
toStartOfYear
Округляет дату или дату-с-временем вниз до первого дня года. Возвращается дата.
toStartOfQuarter
Округляет дату или дату-с-временем вниз до первого дня квартала. Первый день квартала - это одно из 1 января, 1 апреля, 1 июля, 1 октября. Возвращается дата.
toStartOfMonth
Округляет дату или дату-с-временем вниз до первого дня месяца. Возвращается дата.
!!! attention "Attention" Возвращаемое значение для некорректных дат зависит от реализации. ClickHouse может вернуть нулевую дату, выбросить исключение, или выполнить «естественное» перетекание дат между месяцами.
toMonday
Округляет дату или дату-с-временем вниз до ближайшего понедельника. Возвращается дата.
toStartOfDay
Округляет дату-с-временем вниз до начала дня. Возвращается дата-с-временем.
toStartOfHour
Округляет дату-с-временем вниз до начала часа.
toStartOfMinute
Округляет дату-с-временем вниз до начала минуты.
toStartOfSecond
Отсекает доли секунды.
Синтаксис
toStartOfSecond(value[, timezone])
Параметры
value
— Дата и время. DateTime64.timezone
— Часовой пояс для возвращаемого значения (необязательно). Если параметр не задан, используется часовой пояс параметраvalue
. String.
Возвращаемое значение
- Входное значение с отсеченными долями секунды.
Тип: DateTime64.
Примеры
Пример без часового пояса:
WITH toDateTime64('2020-01-01 10:20:30.999', 3) AS dt64 SELECT toStartOfSecond(dt64);
Результат:
┌───toStartOfSecond(dt64)─┐
│ 2020-01-01 10:20:30.000 │
└─────────────────────────┘
Пример с часовым поясом:
WITH toDateTime64('2020-01-01 10:20:30.999', 3) AS dt64 SELECT toStartOfSecond(dt64, 'Europe/Moscow');
Результат:
┌─toStartOfSecond(dt64, 'Europe/Moscow')─┐
│ 2020-01-01 13:20:30.000 │
└────────────────────────────────────────┘
См. также
- Часовая зона сервера, конфигурационный параметр timezone.
toStartOfFiveMinute
Округляет дату-с-временем вниз до начала пятиминутного интервала.
toStartOfTenMinutes
Округляет дату-с-временем вниз до начала десятиминутного интервала.
toStartOfFifteenMinutes
Округляет дату-с-временем вниз до начала пятнадцатиминутного интервала.
toStartOfInterval(time_or_data, INTERVAL x unit [, time_zone])
Обобщение остальных функций toStartOf*
. Например,
toStartOfInterval(t, INTERVAL 1 year)
возвращает то же самое, что и toStartOfYear(t)
,
toStartOfInterval(t, INTERVAL 1 month)
возвращает то же самое, что и toStartOfMonth(t)
,
toStartOfInterval(t, INTERVAL 1 day)
возвращает то же самое, что и toStartOfDay(t)
,
toStartOfInterval(t, INTERVAL 15 minute)
возвращает то же самое, что и toStartOfFifteenMinutes(t)
, и т.п.
toTime
Переводит дату-с-временем на некоторую фиксированную дату, сохраняя при этом время.
toRelativeYearNum
Переводит дату-с-временем или дату в номер года, начиная с некоторого фиксированного момента в прошлом.
toRelativeMonthNum
Переводит дату-с-временем или дату в номер месяца, начиная с некоторого фиксированного момента в прошлом.
toRelativeWeekNum
Переводит дату-с-временем или дату в номер недели, начиная с некоторого фиксированного момента в прошлом.
toRelativeDayNum
Переводит дату-с-временем или дату в номер дня, начиная с некоторого фиксированного момента в прошлом.
toRelativeHourNum
Переводит дату-с-временем в номер часа, начиная с некоторого фиксированного момента в прошлом.
toRelativeMinuteNum
Переводит дату-с-временем в номер минуты, начиная с некоторого фиксированного момента в прошлом.
toRelativeSecondNum
Переводит дату-с-временем в номер секунды, начиная с некоторого фиксированного момента в прошлом.
date_trunc
Отсекает от даты и времени части, меньшие чем указанная часть.
Синтаксис
date_trunc(unit, value[, timezone])
Синоним: dateTrunc
.
Параметры
-
unit
— Название части даты или времени. String. Возможные значения:second
minute
hour
day
week
month
quarter
year
-
value
— Дата и время. DateTime или DateTime64. -
timezone
— Часовой пояс для возвращаемого значения (необязательно). Если параметр не задан, используется часовой пояс параметраvalue
. String
Возвращаемое значение
- Дата и время, отсеченные до указанной части.
Тип: Datetime.
Примеры
Запрос без указания часового пояса:
SELECT now(), date_trunc('hour', now());
Результат:
┌───────────────now()─┬─date_trunc('hour', now())─┐
│ 2020-09-28 10:40:45 │ 2020-09-28 10:00:00 │
└─────────────────────┴───────────────────────────┘
Запрос с указанием часового пояса:
SELECT now(), date_trunc('hour', now(), 'Europe/Moscow');
Результат:
┌───────────────now()─┬─date_trunc('hour', now(), 'Europe/Moscow')─┐
│ 2020-09-28 10:46:26 │ 2020-09-28 13:00:00 │
└─────────────────────┴────────────────────────────────────────────┘
См. также
now
Возвращает текущую дату и время.
Синтаксис
now([timezone])
Параметры
timezone
— часовой пояс для возвращаемого значения (необязательно). String
Возвращаемое значение
- Текущие дата и время.
Тип: Datetime.
Пример
Запрос без указания часового пояса:
SELECT now();
Результат:
┌───────────────now()─┐
│ 2020-10-17 07:42:09 │
└─────────────────────┘
Запрос с указанием часового пояса:
SELECT now('Europe/Moscow');
Результат:
┌─now('Europe/Moscow')─┐
│ 2020-10-17 10:42:23 │
└──────────────────────┘
today
Принимает ноль аргументов и возвращает текущую дату на один из моментов выполнения запроса. То же самое, что toDate(now())
yesterday
Принимает ноль аргументов и возвращает вчерашнюю дату на один из моментов выполнения запроса. Делает то же самое, что today() - 1.
dateDiff
Вычисляет разницу между двумя значениями дат с временем.
Синтаксис
dateDiff('unit', startdate, enddate, [timezone])
Параметры
-
unit
— Единица измерения времени, в которой будет вычислена разница междуstartdate
иenddate
. String.Поддерживаемые значения: | unit | | ------ | |second | |minute | |hour | |day | |week | |month | |quarter | |year |
-
timezone
— Опциональный параметр. Если определен, применяется к обоим значениям:startdate
иenddate
. Если не определен, используются часовые поясаstartdate
иenddate
. Если часовые пояса не совпадают, вернется неожидаемый результат.
Возвращаемое значение
Разница между startdate
и enddate
, выраженная в unit
.
Тип: int
.
Пример
Запрос:
SELECT dateDiff('hour', toDateTime('2018-01-01 22:00:00'), toDateTime('2018-01-02 23:00:00'));
Ответ:
┌─dateDiff('hour', toDateTime('2018-01-01 22:00:00'), toDateTime('2018-01-02 23:00:00'))─┐
│ 25 │
└────────────────────────────────────────────────────────────────────────────────────────┘
timeSlot
Округляет время до получаса. Эта функция является специфичной для Яндекс.Метрики, так как пол часа - минимальное время, для которого, если соседние по времени хиты одного посетителя на одном счётчике отстоят друг от друга строго более, чем на это время, визит может быть разбит на два визита. То есть, кортежи (номер счётчика, идентификатор посетителя, тайм-слот) могут использоваться для поиска хитов, входящий в соответствующий визит.
timeSlots(StartTime, Duration,[, Size])
Для интервала времени, начинающегося в ‘StartTime’ и продолжающегося ‘Duration’ секунд, возвращает массив моментов времени, состоящий из округлений вниз до ‘Size’ точек в секундах из этого интервала. ‘Size’ - необязательный параметр, константный UInt32, по умолчанию равен 1800.
Например, timeSlots(toDateTime('2012-01-01 12:20:00'), toUInt32(600)) = [toDateTime('2012-01-01 12:00:00'), toDateTime('2012-01-01 12:30:00')]
.
Это нужно для поиска хитов, входящих в соответствующий визит.
formatDateTime
Функция преобразует дату-и-время в строку по заданному шаблону. Важно: шаблон — константное выражение, поэтому использовать разные шаблоны в одной колонке не получится.
Синтаксис
formatDateTime(Time, Format\[, Timezone\])
Возвращаемое значение
Возвращает значение времени и даты в определенном вами формате.
Поля подстановки
Используйте поля подстановки для того, чтобы определить шаблон для выводимой строки. В колонке «Пример» результат работы функции для времени 2018-01-02 22:33:44
.
Поле | Описание | Пример |
---|---|---|
%C | номер года, поделённый на 100 (00-99) | 20 |
%d | день месяца, с ведущим нулём (01-31) | 02 |
%D | короткая запись %m/%d/%y | 01/02/18 |
%e | день месяца, с ведущим пробелом ( 1-31) | 2 |
%F | короткая запись %Y-%m-%d | 2018-01-02 |
%G | четырехзначный формат вывода ISO-года, который основывается на особом подсчете номера недели согласно стандарту ISO 8601, обычно используется вместе с %V | 2018 |
%g | двузначный формат вывода года по стандарту ISO 8601 | 18 |
%H | час в 24-часовом формате (00-23) | 22 |
%I | час в 12-часовом формате (01-12) | 10 |
%j | номер дня в году, с ведущими нулями (001-366) | 002 |
%m | месяц, с ведущим нулём (01-12) | 01 |
%M | минуты, с ведущим нулём (00-59) | 33 |
%n | символ переноса строки (‘’) | |
%p | обозначения AM или PM | PM |
%R | короткая запись %H:%M | 22:33 |
%S | секунды, с ведущими нулями (00-59) | 44 |
%t | символ табуляции (’) | |
%T | формат времени ISO 8601, одинаковый с %H:%M:%S | 22:33:44 |
%u | номер дня недели согласно ISO 8601, понедельник - 1, воскресенье - 7 | 2 |
%V | номер недели согласно ISO 8601 (01-53) | 01 |
%w | номер дня недели, начиная с воскресенья (0-6) | 2 |
%y | год, последние 2 цифры (00-99) | 18 |
%Y | год, 4 цифры | 2018 |
%% | символ % | % |
Пример
Запрос:
SELECT formatDateTime(toDate('2010-01-04'), '%g')
Ответ:
┌─formatDateTime(toDate('2010-01-04'), '%g')─┐
│ 10 │
└────────────────────────────────────────────┘