date-time-functions.md 19.8 KB
Newer Older
1 2 3 4 5
---
toc_priority: 39
toc_title: "\u0424\u0443\u043d\u043a\u0446\u0438\u0438\u0020\u0434\u043b\u044f\u0020\u0440\u0430\u0431\u043e\u0442\u044b\u0020\u0441\u0020\u0434\u0430\u0442\u0430\u043c\u0438\u0020\u0438\u0020\u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c"
---

6
# Функции для работы с датами и временем {#funktsii-dlia-raboty-s-datami-i-vremenem}
7 8 9 10 11

Поддержка часовых поясов

Все функции по работе с датой и временем, для которых это имеет смысл, могут принимать второй, необязательный аргумент - имя часового пояса. Пример: Asia/Yekaterinburg. В этом случае, они используют не локальный часовой пояс (по умолчанию), а указанный.

12
``` sql
13 14 15 16 17 18
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
```
19

20
``` text
21 22 23 24
┌────────────────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 │
└─────────────────────┴────────────┴────────────┴─────────────────────┘
```
25

26 27
Поддерживаются только часовые пояса, отличающиеся от UTC на целое число часов.

28 29
## toYear {#toyear}

30 31
Переводит дату или дату-с-временем в число типа UInt16, содержащее номер года (AD).

32 33
## toMonth {#tomonth}

34 35
Переводит дату или дату-с-временем в число типа UInt8, содержащее номер месяца (1-12).

36 37
## toDayOfMonth {#todayofmonth}

38 39
Переводит дату или дату-с-временем в число типа UInt8, содержащее номер дня в месяце (1-31).

40 41
## toDayOfWeek {#todayofweek}

42 43
Переводит дату или дату-с-временем в число типа UInt8, содержащее номер дня в неделе (понедельник - 1, воскресенье - 7).

44 45
## toHour {#tohour}

46 47 48
Переводит дату-с-временем в число типа UInt8, содержащее номер часа в сутках (0-23).
Функция исходит из допущения, что перевод стрелок вперёд, если осуществляется, то на час, в два часа ночи, а перевод стрелок назад, если осуществляется, то на час, в три часа ночи (что, в общем, не верно - даже в Москве два раза перевод стрелок был осуществлён в другое время).

49 50
## toMinute {#tominute}

51 52
Переводит дату-с-временем в число типа UInt8, содержащее номер минуты в часе (0-59).

53 54
## toSecond {#tosecond}

55 56 57
Переводит дату-с-временем в число типа UInt8, содержащее номер секунды в минуте (0-59).
Секунды координации не учитываются.

58
## toUnixTimestamp {#to-unix-timestamp}
S
Sergei Bocharov 已提交
59

A
alexey-milovidov 已提交
60 61 62
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.
S
Sergei Bocharov 已提交
63

64
**Syntax**
S
Sergei Bocharov 已提交
65

66
``` sql
A
alexey-milovidov 已提交
67 68
toUnixTimestamp(datetime)
toUnixTimestamp(str, [timezone])
S
Sergei Bocharov 已提交
69 70
```

A
alexey-milovidov 已提交
71
**Returned value**
S
Sergei Bocharov 已提交
72

73
-   Returns the unix timestamp.
S
Sergei Bocharov 已提交
74

A
alexey-milovidov 已提交
75
Type: `UInt32`.
S
Sergei Bocharov 已提交
76

A
alexey-milovidov 已提交
77
**Example**
S
Sergei Bocharov 已提交
78

A
alexey-milovidov 已提交
79
Query:
S
Sergei Bocharov 已提交
80

81
``` sql
S
Sergei Bocharov 已提交
82 83 84
SELECT toUnixTimestamp('2017-11-05 08:07:47', 'Asia/Tokyo') AS unix_timestamp
```

A
alexey-milovidov 已提交
85
Result:
S
Sergei Bocharov 已提交
86

87
``` text
S
Sergei Bocharov 已提交
88 89 90 91 92
┌─unix_timestamp─┐
│     1509836867 │
└────────────────┘
```

93 94
## toStartOfYear {#tostartofyear}

95 96 97
Округляет дату или дату-с-временем вниз до первого дня года.
Возвращается дата.

98 99
## toStartOfQuarter {#tostartofquarter}

100 101
Округляет дату или дату-с-временем вниз до первого дня квартала.
Первый день квартала - это одно из 1 января, 1 апреля, 1 июля, 1 октября.
102 103
Возвращается дата.

104 105
## toStartOfMonth {#tostartofmonth}

106 107 108
Округляет дату или дату-с-временем вниз до первого дня месяца.
Возвращается дата.

109 110 111 112
!!! attention "Attention"
    Возвращаемое значение для некорректных дат зависит от реализации. ClickHouse может вернуть нулевую дату, выбросить исключение, или выполнить «естественное» перетекание дат между месяцами.

## toMonday {#tomonday}
113

114
Округляет дату или дату-с-временем вниз до ближайшего понедельника.
115 116
Возвращается дата.

117 118
## toStartOfDay {#tostartofday}

119 120
Округляет дату-с-временем вниз до начала дня. Возвращается дата-с-временем.

121 122
## toStartOfHour {#tostartofhour}

123
Округляет дату-с-временем вниз до начала часа.
124

125 126
## toStartOfMinute {#tostartofminute}

127 128
Округляет дату-с-временем вниз до начала минуты.

B
BayoNet 已提交
129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184
## toStartOfSecond {#tostartofsecond}

Отсекает доли секунды.

**Синтаксис**

``` sql
toStartOfSecond(value[, timezone])
```

**Параметры**

-   `value` — Дата и время. [DateTime64](../data-types/datetime64.md).
-   `timezone`[Часовой пояс](../../operations/server-configuration-parameters/settings.md#server_configuration_parameters-timezone) для возвращаемого значения (необязательно). Если параметр не задан, используется часовой пояс параметра `value`. [String](../data-types/string.md). 

**Возвращаемое значение**

- Входное значение с отсеченными долями секунды.

Тип: [DateTime64](../data-types/datetime64.md).

**Примеры**

Пример без часового пояса:

``` sql
WITH toDateTime64('2020-01-01 10:20:30.999', 3) AS dt64 SELECT toStartOfSecond(dt64);
```

Результат:

``` text
┌───toStartOfSecond(dt64)─┐
│ 2020-01-01 10:20:30.000 │
└─────────────────────────┘
```

Пример с часовым поясом:

``` sql
WITH toDateTime64('2020-01-01 10:20:30.999', 3) AS dt64 SELECT toStartOfSecond(dt64, 'Europe/Moscow');
```

Результат:

``` text
┌─toStartOfSecond(dt64, 'Europe/Moscow')─┐
│                2020-01-01 13:20:30.000 │
└────────────────────────────────────────┘
```

**См. также**

- Часовая зона сервера, конфигурационный параметр [timezone](../../operations/server-configuration-parameters/settings.md#server_configuration_parameters-timezone).


185 186
## toStartOfFiveMinute {#tostartoffiveminute}

187 188
Округляет дату-с-временем вниз до начала пятиминутного интервала.

189 190
## toStartOfTenMinutes {#tostartoftenminutes}

191 192
Округляет дату-с-временем вниз до начала десятиминутного интервала.

193 194
## toStartOfFifteenMinutes {#tostartoffifteenminutes}

195 196
Округляет дату-с-временем вниз до начала пятнадцатиминутного интервала.

A
Alexey Milovidov 已提交
197
## toStartOfInterval(time_or_data, INTERVAL x unit \[, time_zone\]) {#tostartofintervaltime-or-data-interval-x-unit-time-zone}
198 199 200 201 202

Обобщение остальных функций `toStartOf*`. Например,
`toStartOfInterval(t, INTERVAL 1 year)` возвращает то же самое, что и `toStartOfYear(t)`,
`toStartOfInterval(t, INTERVAL 1 month)` возвращает то же самое, что и `toStartOfMonth(t)`,
`toStartOfInterval(t, INTERVAL 1 day)` возвращает то же самое, что и `toStartOfDay(t)`,
203
`toStartOfInterval(t, INTERVAL 15 minute)` возвращает то же самое, что и `toStartOfFifteenMinutes(t)`, и т.п.
Z
zhang2014 已提交
204

205 206
## toTime {#totime}

207 208
Переводит дату-с-временем на некоторую фиксированную дату, сохраняя при этом время.

209 210
## toRelativeYearNum {#torelativeyearnum}

211 212
Переводит дату-с-временем или дату в номер года, начиная с некоторого фиксированного момента в прошлом.

213 214
## toRelativeMonthNum {#torelativemonthnum}

215 216
Переводит дату-с-временем или дату в номер месяца, начиная с некоторого фиксированного момента в прошлом.

217 218
## toRelativeWeekNum {#torelativeweeknum}

219 220
Переводит дату-с-временем или дату в номер недели, начиная с некоторого фиксированного момента в прошлом.

221 222
## toRelativeDayNum {#torelativedaynum}

223 224
Переводит дату-с-временем или дату в номер дня, начиная с некоторого фиксированного момента в прошлом.

225 226
## toRelativeHourNum {#torelativehournum}

227 228
Переводит дату-с-временем в номер часа, начиная с некоторого фиксированного момента в прошлом.

229 230
## toRelativeMinuteNum {#torelativeminutenum}

231 232
Переводит дату-с-временем в номер минуты, начиная с некоторого фиксированного момента в прошлом.

233 234
## toRelativeSecondNum {#torelativesecondnum}

235 236
Переводит дату-с-временем в номер секунды, начиная с некоторого фиксированного момента в прошлом.

237
## now {#now}
238

239 240 241
Принимает ноль аргументов и возвращает текущее время на один из моментов выполнения запроса.
Функция возвращает константу, даже если запрос выполнялся долго.

242 243
## today {#today}

244 245 246
Принимает ноль аргументов и возвращает текущую дату на один из моментов выполнения запроса.
То же самое, что toDate(now())

247 248
## yesterday {#yesterday}

249 250 251
Принимает ноль аргументов и возвращает вчерашнюю дату на один из моментов выполнения запроса.
Делает то же самое, что today() - 1.

S
Sergei Bocharov 已提交
252 253 254 255 256 257
## dateDiff {#datediff}

Вычисляет разницу между двумя значениями дат с временем.

**Синтаксис**

258
``` sql
S
Sergei Bocharov 已提交
259 260 261 262 263
dateDiff('unit', startdate, enddate, [timezone])
```

**Параметры**

264
-   `unit` — Единица измерения времени, в которой будет вычислена разница между `startdate` и `enddate`. [String](../syntax.md#syntax-string-literal).
S
Sergei Bocharov 已提交
265

266
        Поддерживаемые значения:
S
Sergei Bocharov 已提交
267

268 269 270 271 272 273 274 275 276 277
        | unit   |
        | ------ |
        |second  |
        |minute  |
        |hour    |
        |day     |
        |week    |
        |month   |
        |quarter |
        |year    |
S
Sergei Bocharov 已提交
278

279
-   `startdate` — Первая дата. [Date](../../sql-reference/functions/date-time-functions.md) или [DateTime](../../sql-reference/functions/date-time-functions.md).
280

281
-   `enddate` — Вторая дата. [Date](../../sql-reference/functions/date-time-functions.md) или [DateTime](../../sql-reference/functions/date-time-functions.md).
282

283
-   `timezone` — Опциональный параметр. Если определен, применяется к обоим значениям: `startdate` и `enddate`. Если не определен, используются часовые пояса `startdate` и `enddate`. Если часовые пояса не совпадают, вернется неожидаемый результат.
S
Sergei Bocharov 已提交
284 285 286 287 288 289 290 291 292 293 294

**Возвращаемое значение**

Разница между `startdate` и `enddate`, выраженная в `unit`.

Тип: `int`.

**Пример**

Запрос:

295
``` sql
S
Sergei Bocharov 已提交
296 297 298 299 300
SELECT dateDiff('hour', toDateTime('2018-01-01 22:00:00'), toDateTime('2018-01-02 23:00:00'));
```

Ответ:

301
``` text
S
Sergei Bocharov 已提交
302 303 304 305 306
┌─dateDiff('hour', toDateTime('2018-01-01 22:00:00'), toDateTime('2018-01-02 23:00:00'))─┐
│                                                                                     25 │
└────────────────────────────────────────────────────────────────────────────────────────┘
```

307 308
## timeSlot {#timeslot}

309 310 311
Округляет время до получаса.
Эта функция является специфичной для Яндекс.Метрики, так как пол часа - минимальное время, для которого, если соседние по времени хиты одного посетителя на одном счётчике отстоят друг от друга строго более, чем на это время, визит может быть разбит на два визита. То есть, кортежи (номер счётчика, идентификатор посетителя, тайм-слот) могут использоваться для поиска хитов, входящий в соответствующий визит.

312 313 314
## timeSlots(StartTime, Duration,\[, Size\]) {#timeslotsstarttime-duration-size}

Для интервала времени, начинающегося в ‘StartTime’ и продолжающегося ‘Duration’ секунд, возвращает массив моментов времени, состоящий из округлений вниз до ‘Size’ точек в секундах из этого интервала. ‘Size’ - необязательный параметр, константный UInt32, по умолчанию равен 1800.
315

316
Например, `timeSlots(toDateTime('2012-01-01 12:20:00'), toUInt32(600)) = [toDateTime('2012-01-01 12:00:00'), toDateTime('2012-01-01 12:30:00')]`.
317
Это нужно для поиска хитов, входящих в соответствующий визит.
318

319
## formatDateTime {#formatdatetime}
320

321
Функция преобразует дату-и-время в строку по заданному шаблону. Важно: шаблон — константное выражение, поэтому использовать разные шаблоны в одной колонке не получится.
322

323 324 325 326 327 328 329 330 331 332 333 334
**Синтаксис**

``` sql
formatDateTime(Time, Format\[, Timezone\])
```

**Возвращаемое значение**

Возвращает значение времени и даты в определенном вами формате.

**Поля подстановки**
Используйте поля подстановки для того, чтобы определить шаблон для выводимой строки. В колонке «Пример» результат работы функции для времени `2018-01-02 22:33:44`.
335

336
| Поле        | Описание                                                             | Пример     |
337 338 339 340 341 342
|-------------|----------------------------------------------------------------------|------------|
| %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 |
343 344
| %G          | четырехзначный формат вывода ISO-года, который основывается на особом подсчете номера недели согласно [стандарту ISO 8601](https://ru.wikipedia.org/wiki/ISO_8601), обычно используется вместе с %V   | 2018       |
| %g          | двузначный формат вывода года по стандарту ISO 8601                  | 18         |
345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361
| %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       |
| %%          | символ %                                                             | %          |
I
Ivan Blinkov 已提交
362

363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379
**Пример**

Запрос:

``` sql
SELECT formatDateTime(toDate('2010-01-04'), '%g')
```

Ответ:

```
┌─formatDateTime(toDate('2010-01-04'), '%g')─┐
│ 10                                         │
└────────────────────────────────────────────┘
```

[Оригинальная статья](https://clickhouse.tech/docs/ru/query_language/functions/date_time_functions/) <!--hide-->