五、clickhouse处理时间日期函数概述(1)
--1.概述
--所有对时区有逻辑用途的处理日期和时间的函数都可以接受第二个可选的时区参数。支持时区。示例: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 Query id: 1a4f8d81-c173-46a0-b3df-ce4204268fc6 ┌────────────────time─┬─date_local─┬─date_yekat─┬─time_samoa──────────┐ │ 2016-06-15 23:00:00 │ 2016-06-15 │ 2016-06-15 │ 2016-06-15 04:00:00 │ └─────────────────────┴────────────┴────────────┴─────────────────────┘ 1 rows in set. Elapsed: 0.036 sec.
--2.timeZone()
--返回服务器的时区。如果它在分布式表的上下文中执行,那么它会生成一个普通列,其中包含与每个分片相关的值。否则它会产生一个常数值。
句法
timeZone()
别名:timezone
。
返回值
- 时区。
类型:字符串。
--3.toTimeZone
--将时间或日期和时间转换为指定的时区。时区是Date
和DateTime
数据类型的属性。表字段或结果集列的内部值(秒数)不会改变,列的类型会改变,其字符串表示也会相应改变。
句法
toTimezone(value, timezone)
别名:toTimezone
。
论据
value
— 时间或日期和时间。日期时间64。timezone
— 返回值的时区。字符串。此参数是一个常量,因为toTimezone
更改了列的时区(时区是DateTime*
类型的属性)。
返回值
- 日期和时间。
类型:日期时间。
例子
SELECT toDateTime('2019-01-01 00:00:00', 'UTC') AS time_utc, toTypeName(time_utc) AS type_utc, toInt32(time_utc) AS int32utc, toTimeZone(time_utc, 'Asia/Yekaterinburg') AS time_yekat, toTypeName(time_yekat) AS type_yekat, toInt32(time_yekat) AS int32yekat, toTimeZone(time_utc, 'US/Samoa') AS time_samoa, toTypeName(time_samoa) AS type_samoa, toInt32(time_samoa) AS int32samoa FORMAT Vertical Query id: 6ca651bc-4347-49ff-a0e7-cab1f5eb62d9 Row 1: ────── time_utc: 2019-01-01 00:00:00 type_utc: DateTime('UTC') int32utc: 1546300800 time_yekat: 2019-01-01 05:00:00 type_yekat: DateTime('Asia/Yekaterinburg') int32yekat: 1546300800 time_samoa: 2018-12-31 13:00:00 type_samoa: DateTime('US/Samoa') int32samoa: 1546300800 1 rows in set. Elapsed: 0.038 sec. --toTimeZone(time_utc, 'Asia/Yekaterinburg')将DateTime('UTC')类型更改为DateTime('Asia/Yekaterinburg'). 值 (Unixtimestamp) 1546300800 保持不变,但字符串表示形式(toString() 函数的结果)从time_utc: 2019-01-01 00:00:00变为time_yekat: 2019-01-01 05:00:00。
--4.timeZoneOf
--返回DateTime或DateTime64数据类型的时区名称。
句法
timeZoneOf(value)
别名:timezoneOf
。
论据
value
- 日期和时间。DateTime或DateTime64。
返回值
- 时区名称。
类型:字符串。
例子
SELECT timezoneOf(now()) Query id: c5a9c385-9a68-4916-8f1a-329cb4c9fd83 ┌─timezoneOf(now())─┐ │ Asia/Shanghai │ └───────────────────┘ 1 rows in set. Elapsed: 0.003 sec.
--5.timeZoneOffset
--从UTC返回以秒为单位的时区偏移量。该函数考虑了指定日期和时间的夏令时和历史时区变化。 IANA 时区数据库用于计算偏移量。
句法
timeZoneOffset(value)
别名:timezoneOffset
。
论据
value
- 日期和时间。DateTime或DateTime64。
返回值
- 以秒为单位的 UTC 偏移量。
类型:Int32。
例子
SELECT toDateTime('2021-04-21 10:20:30', 'America/New_York') AS Time, toTypeName(Time) AS Type, timeZoneOffset(Time) AS Offset_in_seconds, Offset_in_seconds / 3600 AS Offset_in_hours Query id: a9e7279f-8d12-4c51-8cb4-0123f062a597 ┌────────────────Time─┬─Type─────────────────────────┬─Offset_in_seconds─┬─Offset_in_hours─┐ │ 2021-04-21 10:20:30 │ DateTime('America/New_York') │ -14400 │ -4 │ └─────────────────────┴──────────────────────────────┴───────────────────┴─────────────────┘ 1 rows in set. Elapsed: 0.047 sec.
--6.toYear
--将日期或带时间的日期转换为包含年号 (AD) 的 UInt16 数字。
别名:YEAR
。
--7.toQuarter
--将日期或带时间的日期转换为包含季度数字的 UInt8 数字。
别名:QUARTER
。
--8.toMonth
--将日期或带时间的日期转换为包含月份编号 (1-12) 的 UInt8 数字。
别名:MONTH
。
--9.toDayOfYear
--将日期或带时间的日期转换为 UInt16 数字,其中包含一年中的日期 (1-366)。
别名:DAYOFYEAR
。
--10.toDayOfMonth
--将日期或带时间的日期转换为 UInt8 数字,其中包含月份中的天数 (1-31)。
别名:DAYOFMONTH
, DAY
.
--11.toDayOfWeek
--将日期或带时间的日期转换为包含星期几的 UInt8 数字(星期一为 1,星期日为 7)。
别名:DAYOFWEEK
。
--12.toHour
--将带时间的日期转换为包含 24 小时制小时数 (0-23) 的 UInt8 数字。这个函数假设如果时钟向前移动一小时,发生在凌晨 2 点,如果时钟向后移动,它向前移动一小时,发生在凌晨 3 点(这并不总是正确的——即使在莫斯科在不同时间更改了两次)。
别名:HOUR
。
--13.toMinute
--将带时间的日期转换为 UInt8 数字,其中包含小时的分钟数 (0-59)。
别名:MINUTE
。
--14.toSecon
--将带时间的日期转换为 UInt8 数字,其中包含分钟中的秒数 (0-59)。不考虑闰秒。
别名:SECOND
。
例子
SELECT toYear(now()), toQuarter(now()), toMonth(now()), toDayOfYear(now()), toDayOfMonth(now()), toDayOfWeek(now()), toHour(now()), toMinute(now()), toSecond(now()) Query id: 63a6217f-c652-4177-9534-6a5e6f497ef1 ┌─toYear(now())─┬─toQuarter(now())─┬─toMonth(now())─┬─toDayOfYear(now())─┬─toDayOfMonth(now())─┬─toDayOfWeek(now())─┬─toHour(now())─┬─toMinute(now())─┬─toSecond(now())─┐ │ 2022 │ 1 │ 3 │ 61 │ 2 │ 3 │ 14 │ 21 │ 27 │ └───────────────┴──────────────────┴────────────────┴────────────────────┴─────────────────────┴────────────────────┴───────────────┴─────────────────┴─────────────────┘ 1 rows in set. Elapsed: 0.002 sec.
--15.toUnixTimestamp
对于 DateTime 参数:将值转换为 UInt32 类型的数字 - Unix 时间戳 ( https://en.wikipedia.org/wiki/Unix_time )。对于String参数:根据时区(可选第二个参数,默认使用服务器时区)将输入字符串转换为日期时间,并返回对应的unix时间戳。
句法
toUnixTimestamp(datetime)
toUnixTimestamp(str, [timezone])
返回值
- 返回 unix 时间戳。
类型:UInt32
.
例子
SELECT toUnixTimestamp('2017-11-05 08:07:47', 'Asia/Tokyo') AS unix_timestamp Query id: 97c8b2f9-9a31-4808-b336-2b306f5b690b ┌─unix_timestamp─┐ │ 1509836867 │ └────────────────┘ 1 rows in set. Elapsed: 0.017 sec.
!!!注意 “注意”toStartOf*
下面描述的返回类型函数是Date
或DateTime
。尽管这些函数可以DateTime64
作为参数,但传递一个DateTime64
超出正常范围(1925 年 - 2283 年)的参数将给出不正确的结果。
--16.toStartOfYear
--将日期或带时间的日期向下舍入到一年的第一天。返回日期。
--17.toStartOfISOYear
--将日期或带时间的日期向下舍入到 ISO 年的第一天。返回日期。
--18.toStartOfQuarter
--将日期或带时间的日期向下舍入到季度的第一天。季度的第一天是 1 月 1 日、4 月 1 日、7 月 1 日或 10 月 1 日。返回日期。
--19.toStartOfMonth
-将日期或带时间的日期向下舍入到该月的第一天。返回日期。
!!!注意 “注意” 解析错误日期的行为是特定于实现的。ClickHouse 可能会返回零日期、抛出异常或“自然”溢出。
--20.toMonday
--将日期或带时间的日期向下舍入到最近的星期一。返回日期。
--21.toStartOfWeek (t [, mode])
--按模式将日期或带时间的日期向下舍入到最近的星期日或星期一。返回日期。mode 参数的工作方式与 toWeek() 的 mode 参数完全相同。对于单参数语法,使用模式值 0。
--22.toStartOfDay
--将日期与时间向下舍入到一天的开始。
--23.toStartOfHour
--将日期与时间向下舍入到小时的开始。
--24.toStartOfMinute
--将日期与时间向下舍入到分钟的开始。
例子
SELECT toStartOfYear(now()), toStartOfISOYear(now()), toStartOfQuarter(now()), toStartOfMonth(now()), toMonday(now()), toStartOfWeek(now()), toStartOfDay(now()), toStartOfHour(now()), toStartOfMinute(now()) Query id: 35773701-1293-4e4b-b18e-e9527f548151 ┌─toStartOfYear(now())─┬─toStartOfISOYear(now())─┬─toStartOfQuarter(now())─┬─toStartOfMonth(now())─┬─toMonday(now())─┬─toStartOfWeek(now())─┬─toStartOfDay(now())─┬─toStartOfHour(now())─┬─toStartOfMinute(now())─┐ │ 2022-01-01 │ 2022-01-03 │ 2022-01-01 │ 2022-03-01 │ 2022-02-28 │ 2022-02-27 │ 2022-03-02 00:00:00 │ 2022-03-02 14:00:00 │ 2022-03-02 14:42:00 │ └──────────────────────┴─────────────────────────┴─────────────────────────┴───────────────────────┴─────────────────┴──────────────────────┴─────────────────────┴──────────────────────┴────────────────────────┘ 1 rows in set. Elapsed: 0.003 sec.
--25.toStartOfSecond
截断亚秒。
句法
toStartOfSecond(value, [timezone])
论据
value
- 日期和时间。日期时间64。timezone
—返回值的时区(可选)。如果未指定,则函数使用value
参数的时区。字符串。
返回值
- 输入值没有秒。
类型:DateTime64。
例子
--无时区 WITH toDateTime64('2020-01-01 10:20:30.999', 3) AS dt64 SELECT toStartOfSecond(dt64) Query id: bec9da7f-97d8-476e-a658-387e73e3199a ┌───toStartOfSecond(dt64)─┐ │ 2020-01-01 10:20:30.000 │ └─────────────────────────┘ 1 rows in set. Elapsed: 0.003 sec. --有时区 WITH toDateTime64('2020-01-01 10:20:30.999', 3) AS dt64 SELECT toStartOfSecond(dt64, 'Europe/Moscow') Query id: 505de849-4a1f-4000-b957-0eaf78e11430 ┌─toStartOfSecond(dt64, 'Europe/Moscow')─┐ │ 2020-01-01 05:20:30.000 │ └────────────────────────────────────────┘ 1 rows in set. Elapsed: 0.032 sec.
也可以看看
- 时区服务器配置参数。
--26.toStartOfFiveMinute
--将日期与时间向下舍入到五分钟间隔的开始。
--27.toStartOfTenMinutes
--将日期与时间向下舍入到十分钟间隔的开始。
--28.toStartOfFifteenMinutes
--将日期与时间向下舍入到十五分钟间隔的开始。
--29.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)
等。
--30.toTime
--将带时间的日期转换为某个固定日期,同时保留时间。
--31.toRelativeYearNum
--从过去的某个固定点开始,将带有时间或日期的日期转换为年数。
--32.toRelativeQuarterNum
--从过去的某个固定点开始,将带有时间或日期的日期转换为季度数。
--33.toRelativeMonthNum
--从过去的某个固定点开始,将带有时间或日期的日期转换为月份数。
--34.toRelativeWeekNum
--从过去的某个固定点开始,将带有时间或日期的日期转换为周数。
--35.toRelativeDayNum
--从过去的某个固定点开始,将带有时间或日期的日期转换为天数。
--36.toRelativeHourNum
--从过去的某个固定点开始,将带有时间或日期的日期转换为小时数。
--37.toRelativeMinuteNum
--从过去的某个固定点开始,将带有时间或日期的日期转换为分钟数。
--38.toRelativeSecondNum
--从过去的某个固定点开始,将带有时间或日期的日期转换为秒数。
--39.toISOYear
--将日期或带时间的日期转换为包含 ISO 年份编号的 UInt16 数字。
--40.toISOWeek
--将日期或带时间的日期转换为包含 ISO 周数的 UInt8 数字。
例子
SELECT toStartOfFiveMinute(now()), toStartOfTenMinutes(now()), toStartOfFifteenMinutes(now()), toStartOfInterval(now(), toIntervalMonth(1)), toTime(now()), toRelativeYearNum(now()), toRelativeQuarterNum(now()), toRelativeMonthNum(now()), toRelativeWeekNum(now()), toRelativeDayNum(now()), toRelativeHourNum(now()), toRelativeMinuteNum(now()), toRelativeSecondNum(now()), toISOYear(now()), toISOWeek(now()) Query id: e2ca5333-1a7f-4add-8c6d-940498d2d822 ┌─toStartOfFiveMinute(now())─┬─toStartOfTenMinutes(now())─┬─toStartOfFifteenMinutes(now())─┬─toStartOfInterval(now(), toIntervalMonth(1))─┬───────toTime(now())─┬─toRelativeYearNum(now())─┬─toRelativeQuarterNum(now())─┬─toRelativeMonthNum(now())─┬─toRelativeWeekNum(now())─┬─toRelativeDayNum(now())─┬─toRelativeHourNum(now())─┬─toRelativeMinuteNum(now())─┬─toRelativeSecondNum(now())─┬─toISOYear(now())─┬─toISOWeek(now())─┐ │ 2022-03-02 14:50:00 │ 2022-03-02 14:50:00 │ 2022-03-02 14:45:00 │ 2022-03-01 │ 1970-01-02 14:53:11 │ 2022 │ 8088 │ 24267 │ 2722 │ 19053 │ 457278 │ 27436733 │ 1646203991 │ 2022 │ 9 │ └────────────────────────────┴────────────────────────────┴────────────────────────────────┴──────────────────────────────────────────────┴─────────────────────┴──────────────────────────┴─────────────────────────────┴───────────────────────────┴──────────────────────────┴─────────────────────────┴──────────────────────────┴────────────────────────────┴────────────────────────────┴──────────────────┴──────────────────┘ 1 rows in set. Elapsed: 0.005 sec.
--41.toWeek(date[,mode])
--此函数返回日期或日期时间的周数。toWeek() 的双参数形式使您可以指定星期是从星期日还是星期一开始,以及返回值是否应在 0 到 53 或 1 到 53 的范围内。如果省略 mode 参数,则默认mode 为 0。 toISOWeek()
是一个兼容函数,相当于toWeek(date,3)
. 下表描述了 mode 参数的工作方式。
模式 | 一周的第一天 | 范围 | 第 1 周是第一周…… |
---|---|---|---|
0 | 星期日 | 0-53 | 今年有一个星期天 |
1 | 周一 | 0-53 | 今年有 4 天或更多天 |
2 | 星期日 | 1-53 | 今年有一个星期天 |
3 | 周一 | 1-53 | 今年有 4 天或更多天 |
4 | 星期日 | 0-53 | 今年有 4 天或更多天 |
5 | 周一 | 0-53 | 今年有个星期一 |
6 | 星期日 | 1-53 | 今年有 4 天或更多天 |
7 | 周一 | 1-53 | 今年有个星期一 |
8 | 星期日 | 1-53 | 包含 1 月 1 日 |
9 | 周一 | 1-53 | 包含 1 月 1 日 |
对于含义为“今年有 4 天或更多天”的众数值,周数根据 ISO 8601:1988 进行编号:
-
如果包含 1 月 1 日的那一周在新年中有 4 天或更多天,则为第 1 周。
-
否则为上一年的最后一周,下周为第 1 周。
对于具有“包含 1 月 1 日”含义的众数值,包含 1 月 1 日的周是第 1 周。该周包含的新年中的天数无关紧要,即使它仅包含一天。
toWeek(date, [, mode][, Timezone])
论据
date
– 日期或日期时间。mode
– 可选参数,取值范围为 [0,9],默认为 0。Timezone
– 可选参数,它的行为类似于任何其他转换函数。
例子
SELECT toDate('2016-12-27') AS date, toWeek(date) AS week0, toWeek(date, 1) AS week1, toWeek(date, 9) AS week9 Query id: b3d4b1e2-f7ff-4356-988b-a9cd07a0fc91 ┌───────date─┬─week0─┬─week1─┬─week9─┐ │ 2016-12-27 │ 52 │ 52 │ 1 │ └────────────┴───────┴───────┴───────┘ 1 rows in set. Elapsed: 0.002 sec.
--42.toYearWeek(date[,mode])
--返回日期的年和周。结果中的年份可能与一年中第一周和最后一周的日期参数中的年份不同。
mode 参数的工作方式与 toWeek() 的 mode 参数完全相同。对于单参数语法,使用模式值 0。
toISOYear()
是一个与 等价的兼容函数intDiv(toYearWeek(date,3),100)
。
例子
SELECT toDate('2016-12-27') AS date, toYearWeek(date) AS yearWeek0, toYearWeek(date, 1) AS yearWeek1, toYearWeek(date, 9) AS yearWeek9 Query id: 78e61ac3-0b9f-4699-8aa4-c76e570de807 ┌───────date─┬─yearWeek0─┬─yearWeek1─┬─yearWeek9─┐ │ 2016-12-27 │ 201652 │ 201652 │ 201701 │ └────────────┴───────────┴───────────┴───────────┘ 1 rows in set. Elapsed: 0.002 sec.
--43.date_trunc
--将日期和时间数据截断为日期的指定部分。
句法
date_trunc(unit, value[, timezone])
别名:dateTrunc
。
论据
-
unit
— 截断结果的间隔类型。字符串字面量。可能的值:second
minute
hour
day
week
month
quarter
year
-
value
- 日期和时间。DateTime或DateTime64。 -
timezone
—返回值的时区名称(可选)。如果未指定,则函数使用value
参数的时区。字符串。
返回值
- 值,截断为日期的指定部分。
类型:日期时间。
例子
--无时区 SELECT now(), date_trunc('hour', now()); SELECT now(), date_trunc('hour', now()) Query id: 85829c41-caeb-44ef-b89a-77c7c603f22a ┌───────────────now()─┬─date_trunc('hour', now())─┐ │ 2022-03-02 15:02:38 │ 2022-03-02 15:00:00 │ └─────────────────────┴───────────────────────────┘ 1 rows in set. Elapsed: 0.002 sec. --有时区 SELECT now(), date_trunc('hour', now(), 'Europe/Moscow') Query id: ba172c9c-b0a7-4a52-ad83-802905aca615 ┌───────────────now()─┬─date_trunc('hour', now(), 'Europe/Moscow')─┐ │ 2022-03-02 15:03:05 │ 2022-03-02 10:00:00 │ └─────────────────────┴────────────────────────────────────────────┘ 1 rows in set. Elapsed: 0.002 sec.
也可以看看
- toStartOfInterval
--44.date_add
--将时间间隔或日期间隔添加到提供的日期或带时间的日期。
句法
date_add(unit, value, date)
别名:dateAdd
, DATE_ADD
.
论据
-
unit
— 要添加的间隔类型。字符串。可能的值:second
minute
hour
day
week
month
quarter
year
-
value
— 要添加的间隔值。诠释。 -
date
— 添加时间的日期或日期value
。日期或日期时间。
返回值
日期或日期与时间相加,以value
表示。
类型:日期或日期时间。
例子
SELECT toDate('2018-01-01') + toIntervalYear(3) Query id: fe21267f-63cc-431e-9621-1d6acea638a8 ┌─plus(toDate('2018-01-01'), toIntervalYear(3))─┐ │ 2021-01-01 │ └───────────────────────────────────────────────┘ 1 rows in set. Elapsed: 0.002 sec.
--45.date_diff
--返回两个日期或具有时间值的日期之间的差异。
句法
date_diff('unit', startdate, enddate, [timezone])
别名:dateDiff
, DATE_DIFF
.
论据
-
unit
— 结果的间隔类型。字符串。可能的值:second
minute
hour
day
week
month
quarter
year
-
startdate
— 要减去的第一个时间值(减数)。日期或日期时间。 -
enddate
— 要减去的第二个时间值(被减数)。日期或日期时间。 -
timezone
—时区名称(可选)。如果指定,它将同时应用于startdate
和enddate
。如果未指定,则使用startdate
和的时区enddate
。如果它们不相同,则结果未指定。字符串。
返回值
enddate
和startdate之间的间隔值
以 表示unit
。
类型:整数。
例子
SELECT dateDiff('hour', toDateTime('2018-01-01 22:00:00'), toDateTime('2018-01-02 23:00:00')) Query id: 0e2eb852-4e64-4115-9091-a99f0f72eb7c ┌─dateDiff('hour', toDateTime('2018-01-01 22:00:00'), toDateTime('2018-01-02 23:00:00'))─┐ │ 25 │ └────────────────────────────────────────────────────────────────────────────────────────┘ 1 rows in set. Elapsed: 0.002 sec.
--46.date_sub
--从提供的日期或带时间的日期中减去时间间隔或日期间隔。
句法
date_sub(unit, value, date)
别名:dateSub
, DATE_SUB
.
论据
-
unit
— 要减去的区间类型。字符串。可能的值:second
minute
hour
day
week
month
quarter
year
-
value
— 要减去的区间值。诠释。 -
date
value
—减去时间的日期或日期。日期或日期时间。
返回值
通过从中减去value
以 表示的日期或带时间的日期。
类型:日期或日期时间。
例子
SELECT toDate('2018-01-01') - toIntervalYear(3) Query id: 95f59a3d-769e-4411-95f7-d66073c09c1f ┌─minus(toDate('2018-01-01'), toIntervalYear(3))─┐ │ 2015-01-01 │ └────────────────────────────────────────────────┘ 1 rows in set. Elapsed: 0.002 sec.
--47.timestamp_add
--将指定的时间值与提供的日期或日期时间值相加。
句法
timestamp_add(date, INTERVAL value unit)
别名:timeStampAdd
, TIMESTAMP_ADD
.
论据
-
date
— 日期或日期与时间。日期或日期时间。 -
value
— 要添加的间隔值。诠释。 -
unit
— 要添加的间隔类型。字符串。可能的值:second
minute
hour
day
week
month
quarter
year
返回值
日期或日期与时间与指定value
表示在unit
添加到date
。
类型:日期或日期时间。
例子
SELECT toDate('2018-01-01') + toIntervalMonth(3) Query id: f63f52d4-518a-467d-b816-d140cf297a43 ┌─plus(toDate('2018-01-01'), toIntervalMonth(3))─┐ │ 2018-04-01 │ └────────────────────────────────────────────────┘ 1 rows in set. Elapsed: 0.002 sec.
--48.timestamp_sub
--从提供的日期或带时间的日期中减去时间间隔。
句法
timestamp_sub(unit, value, date)
别名:timeStampSub
, TIMESTAMP_SUB
.
论据
-
unit
— 要减去的区间类型。字符串。可能的值:second
minute
hour
day
week
month
quarter
year
-
value
— 要减去的区间值。诠释。 -
date
— 日期或日期与时间。日期或日期时间。
返回值
通过从中减去value
以 表示的日期或带时间的日期。
类型:日期或日期时间。
例子
SELECT toDateTime('2018-12-18 01:02:03') - toIntervalMonth(5) Query id: 1a306988-c92d-440b-a022-cdcb28bebc3b ┌─minus(toDateTime('2018-12-18 01:02:03'), toIntervalMonth(5))─┐ │ 2018-07-18 01:02:03 │ └──────────────────────────────────────────────────────────────┘ 1 rows in set. Elapsed: 0.003 sec.
--49.now
--返回当前日期和时间。
句法
now([timezone])
论据
timezone
—返回值的时区名称(可选)。字符串。
返回值
- 当前日期和时间。
类型:日期时间。
例子
--无时区 SELECT now() Query id: 544bd46f-e17c-49b9-9a76-ba20b9bf93cb ┌───────────────now()─┐ │ 2022-03-02 15:14:11 │ └─────────────────────┘ 1 rows in set. Elapsed: 0.002 sec. --有时区 SELECT now('Europe/Moscow') Query id: 4749552b-81f5-4e75-bc4a-8a8ed2ad06fa ┌─now('Europe/Moscow')─┐ │ 2022-03-02 10:14:19 │ └──────────────────────┘ 1 rows in set. Elapsed: 0.002 sec.
--50.today
--接受零参数并返回请求执行时刻之一的当前日期。与 'toDate(now())' 相同。
--51.yesterday
--接受零参数并在请求执行的某一时刻返回昨天的日期。与“今天() - 1”相同。
--52.timeSlot
--将时间四舍五入到半小时。此功能是 Yandex.Metrica 特有的,因为如果跟踪标签显示单个用户的连续浏览量在时间上的差异严格超过此量,则半小时是将会话分成两个会话的最短时间。这意味着元组(标签 ID、用户 ID 和时间段)可用于搜索包含在相应会话中的综合浏览量。
--53.toYYYYMM
--将日期或带时间的日期转换为包含年月号 (YYYY * 100 + MM) 的 UInt32 数字。
--54.toYYYYMMDD
--将日期或带时间的日期转换为包含年月号 (YYYY * 10000 + MM * 100 + DD) 的 UInt32 数字。
--55.toYYYYMMDDhhmmss
--将日期或带时间的日期转换为包含年月号的 UInt64 数字 (YYYY * 10000000000 + MM * 100000000 + DD * 1000000 + hh * 10000 + mm * 100 + ss)。
例子
SELECT today(), yesterday(), timeSlot(now()), toYYYYMM(now()), toYYYYMMDD(now()), toYYYYMMDDhhmmss(now()) Query id: b663817b-c8f7-4998-b304-ed17ae4a2c22 ┌────today()─┬─yesterday()─┬─────timeSlot(now())─┬─toYYYYMM(now())─┬─toYYYYMMDD(now())─┬─toYYYYMMDDhhmmss(now())─┐ │ 2022-03-02 │ 2022-03-01 │ 2022-03-02 15:00:00 │ 202203 │ 20220302 │ 20220302151846 │ └────────────┴─────────────┴─────────────────────┴─────────────────┴───────────────────┴─────────────────────────┘ 1 rows in set. Elapsed: 0.003 sec.
--56.addYears, addMonths, addWeeks, addDays, addHours, addMinutes, addSeconds, addQuarters
--函数将日期/日期时间间隔添加到日期/日期时间,然后返回日期/日期时间。例如:
WITH toDate('2018-01-01') AS date, toDateTime('2018-01-01 00:00:00') AS date_time SELECT addYears(date, 1) AS add_years_with_date, addYears(date_time, 1) AS add_years_with_date_time Query id: 3fb2e0af-ab17-47a1-ba93-cb6682d67879 ┌─add_years_with_date─┬─add_years_with_date_time─┐ │ 2019-01-01 │ 2019-01-01 00:00:00 │ └─────────────────────┴──────────────────────────┘ 1 rows in set. Elapsed: 0.002 sec.
--57.subtractYears,subtractMonths,subtractWeeks,subtractDays,subtractHours,subtractMinutes,subtractSeconds,subtractQuarters
--函数将日期/日期时间间隔减去日期/日期时间,然后返回日期/日期时间。例如:
WITH toDate('2019-01-01') AS date, toDateTime('2019-01-01 00:00:00') AS date_time SELECT subtractYears(date, 1) AS subtract_years_with_date, subtractYears(date_time, 1) AS subtract_years_with_date_time Query id: b9ab8a6c-abf2-40b9-b05f-32c89c9144cc ┌─subtract_years_with_date─┬─subtract_years_with_date_time─┐ │ 2018-01-01 │ 2018-01-01 00:00:00 │ └──────────────────────────┴───────────────────────────────┘ 1 rows in set. Elapsed: 0.004 sec.
--58.timeSlots(StartTime, Duration,[, Size]) {#timeslotsstarttime-duration-size}
--对于从“StartTime”开始并持续“Duration”秒的时间间隔,它会及时返回一个时刻数组,包括从该间隔向下舍入到“Size”(以秒为单位)的点。'Size' 是一个可选参数:一个常量 UInt32,默认设置为 1800。例如,timeSlots(toDateTime('2012-01-01 12:20:00'), 600) = [toDateTime('2012-01-01 12:00:00'), toDateTime('2012-01-01 12:30:00')]
。这是在相应会话中搜索综合浏览量所必需的。
--59.formatDateTime
--根据给定的格式字符串格式化时间。Format 是一个常量表达式,因此单个结果列不能有多种格式。
句法
formatDateTime(Time, Format\[, Timezone\])
返回值
根据确定的格式返回时间和日期值。
替换字段 使用替换字段,您可以为结果字符串定义模式。“示例”列显示2018-01-02 22:33:44
.
占位符 | 描述 | 例子 |
---|---|---|
%C | 年份除以 100 并截断为整数 (00-99) | 20 |
%d | 一个月中的某一天,零填充 (01-31) | 02 |
%D | 短 MM/DD/YY 日期,相当于 %m/%d/%y | 01/02/18 |
%e | 日期,空格填充 (1-31) | 2 |
%F | 短 YYYY-MM-DD 日期,相当于 %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 指定 | 下午 |
%Q | 季度(1-4) | 1 |
%R | 24 小时 HH:MM 时间,相当于 %H:%M | 22:33 |
%S | 秒(00-59) | 44 |
%t | 水平制表符 (') | |
%T | ISO 8601 时间格式 (HH:MM:SS),相当于 %H:%M:%S | 22:33:44 |
%u | ISO 8601 工作日为数字,星期一为 1 (1-7) | 2 |
%V | ISO 8601 周数 (01-53) | 01 |
%w | 工作日为十进制数,星期日为 0 (0-6) | 2 |
%y | 年份,最后两位数 (00-99) | 18 |
%Y | 年 | 2018 |
%% | 展示% | % |
例子
SELECT formatDateTime(toDate('2010-01-04'), '%g') Query id: 6db79d41-84a3-41b5-afbc-3f2459902942 ┌─formatDateTime(toDate('2010-01-04'), '%g')─┐ │ 10 │ └────────────────────────────────────────────┘ 1 rows in set. Elapsed: 0.002 sec.
--60.dateName
--返回日期的指定部分。
句法
dateName(date_part, date)
论据
date_part
— 日期部分。可能的值:“年”、“季度”、“月”、“周”、“年日”、“日”、“工作日”、“小时”、“分钟”、“秒”。字符串。date
- 日期。日期、日期时间或日期时间64 。timezone
- 时区。可选的。字符串。
返回值
- 日期的指定部分。
类型:字符串
例子
WITH toDateTime('2021-04-14 11:22:33') AS date_value SELECT dateName('year', date_value), dateName('month', date_value), dateName('day', date_value) Query id: 6e38335d-ec94-42f0-9843-65a0b3d217e1 ┌─dateName('year', date_value)─┬─dateName('month', date_value)─┬─dateName('day', date_value)─┐ │ 2021 │ April │ 14 │ └──────────────────────────────┴───────────────────────────────┴─────────────────────────────┘ 1 rows in set. Elapsed: 0.003 sec.
--61.FROM_UNIXTIME
--函数将 Unix 时间戳转换为日历日期和一天中的时间。当只有一个Integer类型的参数时,它的作用与toDateTime相同,并返回DateTime类型。
例子:
SELECT FROM_UNIXTIME(423543535) Query id: 10cb2462-dbc8-4fbd-86b7-c0644b17b620 ┌─FROM_UNIXTIME(423543535)─┐ │ 1983-06-04 10:58:55 │ └──────────────────────────┘ 1 rows in set. Elapsed: 0.002 sec.
当有两个参数时:第一个是Integer或DateTime ,第二个是常量格式字符串——它的作用与formatDateTime相同,并返回String类型。
例如:
SELECT FROM_UNIXTIME(1234334543, '%Y-%m-%d %R:%S') AS DateTime Query id: b25376da-aabb-42d6-b995-4235e4912d8c ┌─DateTime────────────┐ │ 2009-02-11 14:42:23 │ └─────────────────────┘ 1 rows in set. Elapsed: 0.002 sec.
--62.toModifiedJulianDay
--将文本形式的Proleptic 公历YYYY-MM-DD
日期转换为 Int32中的修改后的儒略日数字。此功能支持日期从0000-01-01
到9999-12-31
。如果无法将参数解析为日期或日期无效,则会引发异常。
句法
toModifiedJulianDay(date)
论据
date
— 文本形式的日期。字符串或固定字符串。
返回值
- 修改儒略日数。
类型:Int32。
例子
SELECT toModifiedJulianDay('2020-01-01') Query id: a5f72f60-b7be-438e-9bdb-cd758bef3d27 ┌─toModifiedJulianDay('2020-01-01')─┐ │ 58849 │ └───────────────────────────────────┘ 1 rows in set. Elapsed: 0.002 sec.
--63.toModifiedJulianDayOrNull
--类似于toModifiedJulianDay(),但它不是引发异常而是返回NULL
。
句法
toModifiedJulianDayOrNull(date)
论据
date
— 文本形式的日期。字符串或固定字符串。
返回值
- 修改儒略日数。
类型:可空(Int32)。
例子
SELECT toModifiedJulianDayOrNull('2020-01-01') Query id: 9e6dc247-cbf9-49ed-ba76-4b2726cfb14c ┌─toModifiedJulianDayOrNull('2020-01-01')─┐ │ 58849 │ └─────────────────────────────────────────┘ 1 rows in set. Elapsed: 0.002 sec.
--64.fromModifiedJulianDay
--将修改后的儒略日数字转换为文本形式的Proleptic 公历YYYY-MM-DD
日期。此函数支持从-678941
到的日期编号2973119
(分别代表 0000-01-01 和 9999-12-31)。如果天数超出支持范围,则会引发异常。
句法
fromModifiedJulianDay(day)
论据
day
— 修改儒略日数。任何整数类型。
返回值
- 文本形式的日期。
类型:字符串
例子
SELECT fromModifiedJulianDay(58849) Query id: c53ef32a-7d21-4342-abd1-9afff3872f72 ┌─fromModifiedJulianDay(58849)─┐ │ 2020-01-01 │ └──────────────────────────────┘ 1 rows in set. Elapsed: 0.002 sec.
--65.fromModifiedJulianDayOrNull {#frommodifiedjuliandayornull}
--类似于fromModifiedJulianDayOrNull(),但它不会引发异常,而是返回NULL
。
句法
fromModifiedJulianDayOrNull(day)
论据
day
— 修改儒略日数。任何整数类型。
返回值
- 文本形式的日期。
类型:可空(字符串)
例子
SELECT fromModifiedJulianDayOrNull(58849) Query id: fedf7263-4779-47b7-8b8d-25097afd36ac ┌─fromModifiedJulianDayOrNull(58849)─┐ │ 2020-01-01 │ └────────────────────────────────────┘ 1 rows in set. Elapsed: 0.002 sec.