跳到主要内容
跳到主要内容

用于处理日期和时间的函数

本节中的大多数函数支持可选的时区参数,例如 Europe/Amsterdam。在这种情况下,将使用指定的时区,而不是本地时区(默认时区)。

示例

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 │
└─────────────────────┴────────────┴────────────┴─────────────────────┘

UTCTimestamp

新增于:v22.11

返回在查询解析时的当前日期和时间。该函数是一个常量表达式。

此函数返回的结果与 now('UTC') 相同。它仅为兼容 MySQL 而添加。推荐优先使用 now

语法

UTCTimestamp()

别名: UTC_timestamp

参数

  • 无。

返回值

在查询分析时返回当前的日期和时间。DateTime

示例

获取当前 UTC 时间戳

SELECT UTCTimestamp()
┌──────UTCTimestamp()─┐
│ 2024-05-28 08:32:09 │
└─────────────────────┘

YYYYMMDDToDate

引入于:v23.9

将包含年月日的数值转换为 Date。 该函数与 toYYYYMMDD() 函数执行相反的转换。 如果输入不表示一个有效的 Date 值,则输出未定义。

语法

YYYYMMDDToDate(YYYYMMDD)

参数

返回值

根据提供的参数返回一个 DateDate

示例

示例

SELECT YYYYMMDDToDate(20230911);
┌─toYYYYMMDD(20230911)─┐
│           2023-09-11 │
└──────────────────────┘

YYYYMMDDToDate32

引入于:v23.9

将一个表示年、月和日的数字转换为 Date32。 该函数与函数 toYYYYMMDD() 的作用相反。 如果输入不表示有效的 Date32 值,则输出未定义。

语法

YYYYMMDDToDate32(YYYYMMDD)

参数

返回值

根据提供的参数构造并返回一个 Date32 值。详见 Date32

示例

示例

SELECT YYYYMMDDToDate32(20000507);
┌─YYYYMMDDToDate32(20000507)─┐
│                 2000-05-07 │
└────────────────────────────┘

YYYYMMDDhhmmssToDateTime

自 v23.9 起引入

将包含年、月、日、时、分和秒的数字转换为 DateTime。 此函数是函数 toYYYYMMDDhhmmss() 的逆函数。 如果输入不表示一个有效的 DateTime 值,则输出未定义。

语法

YYYYMMDDhhmmssToDateTime(YYYYMMDDhhmmss[, timezone])

参数

  • YYYYMMDDhhmmss — 包含年、月、日、时、分、秒的数字。(U)Int*Float*Decimal
  • timezone — 时区名称。String

返回值

从提供的参数返回一个 DateTime 值。DateTime

示例

示例

SELECT YYYYMMDDToDateTime(20230911131415);
┌──────YYYYMMDDhhmmssToDateTime(20230911131415)─┐
│                           2023-09-11 13:14:15 │
└───────────────────────────────────────────────┘

YYYYMMDDhhmmssToDateTime64

自 v23.9 版本引入

将一个包含年、月、日、时、分和秒的数字转换为 DateTime64。 此函数是函数 toYYYYMMDDhhmmss() 的反向操作。 如果输入不能表示有效的 DateTime64 值,则结果未定义。

语法

YYYYMMDDhhmmssToDateTime64(YYYYMMDDhhmmss[, precision[, timezone]])

参数

  • YYYYMMDDhhmmss — 包含年、月、日、时、分、秒的数字。(U)Int*Float*Decimal
  • precision — 小数部分的精度(0-9)。UInt8
  • timezone — 时区名称。String

返回值

根据提供的参数构造并返回一个 DateTime64DateTime64

示例

示例

SELECT YYYYMMDDhhmmssToDateTime64(20230911131415, 3, 'Asia/Istanbul');
┌─YYYYMMDDhhmm⋯/Istanbul')─┐
│  2023-09-11 13:14:15.000 │
└──────────────────────────┘

addDate

引入版本:v23.9

将时间间隔加到指定的 datedate with time,或其字符串编码形式上。 如果相加结果超出该数据类型的取值范围,则结果未定义。

语法

addDate(datetime, interval)

参数

返回值

返回通过将 interval 加到 datetime 后得到的日期或带时间的日期。DateDate32DateTimeDateTime64

示例

为日期添加时间间隔

SELECT addDate(toDate('2018-01-01'), INTERVAL 3 YEAR)
┌─addDate(toDa⋯valYear(3))─┐
│               2021-01-01 │
└──────────────────────────┘

addDays

引入版本:v1.1

将指定的天数添加到日期、日期时间,或其字符串表示形式。

语法

addDays(datetime, num)

参数

返回值

返回 datetime 加上 num 天后的结果。DateDate32DateTimeDateTime64

示例

对不同日期类型添加天数

WITH
    toDate('2024-01-01') AS date,
    toDateTime('2024-01-01 00:00:00') AS date_time,
    '2024-01-01 00:00:00' AS date_time_string
SELECT
    addDays(date, 5) AS add_days_with_date,
    addDays(date_time, 5) AS add_days_with_date_time,
    addDays(date_time_string, 5) AS add_days_with_date_time_string
┌─add_days_with_date─┬─add_days_with_date_time─┬─add_days_with_date_time_string─┐
│         2024-01-06 │     2024-01-06 00:00:00 │        2024-01-06 00:00:00.000 │
└────────────────────┴─────────────────────────┴────────────────────────────────┘

使用另一种 INTERVAL 语法

SELECT dateAdd('1998-06-16'::Date, INTERVAL 10 day)
┌─plus(CAST('1⋯valDay(10))─┐
│               1998-06-26 │
└──────────────────────────┘

addHours

自 v1.1 起引入

将指定的小时数添加到日期、日期时间或其字符串编码形式上。

语法

addHours(datetime, num)

参数

返回值

返回 datetime 加上 num 小时后的结果,类型为 DateTimeDateTime64(3)

示例

为不同的日期类型添加小时数

WITH
    toDate('2024-01-01') AS date,
    toDateTime('2024-01-01 00:00:00') AS date_time,
    '2024-01-01 00:00:00' AS date_time_string
SELECT
    addHours(date, 12) AS add_hours_with_date,
    addHours(date_time, 12) AS add_hours_with_date_time,
    addHours(date_time_string, 12) AS add_hours_with_date_time_string
┌─add_hours_with_date─┬─add_hours_with_date_time─┬─add_hours_with_date_time_string─┐
│ 2024-01-01 12:00:00 │      2024-01-01 12:00:00 │         2024-01-01 12:00:00.000 │
└─────────────────────┴──────────────────────────┴─────────────────────────────────┘

使用另一种 INTERVAL 语法

SELECT dateAdd('1998-06-16'::Date, INTERVAL 10 hour)
┌─plus(CAST('1⋯alHour(10))─┐
│      1998-06-16 10:00:00 │
└──────────────────────────┘

addInterval

自 v22.11 引入

将一个间隔加到另一个间隔或间隔元组上。

注意

相同类型的间隔会合并为单个间隔。例如,如果传入 toIntervalDay(1)toIntervalDay(2),则结果为 (3) 而不是 (1,1)

语法

addInterval(interval_1, interval_2)

参数

返回值

返回一个区间元组 Tuple(Interval)

示例

区间相加

SELECT addInterval(INTERVAL 1 DAY, INTERVAL 1 MONTH);
SELECT addInterval((INTERVAL 1 DAY, INTERVAL 1 YEAR), INTERVAL 1 MONTH);
SELECT addInterval(INTERVAL 2 DAY, INTERVAL 1 DAY)
┌─addInterval(toIntervalDay(1), toIntervalMonth(1))─┐
│ (1,1)                                             │
└───────────────────────────────────────────────────┘
┌─addInterval((toIntervalDay(1), toIntervalYear(1)), toIntervalMonth(1))─┐
│ (1,1,1)                                                                │
└────────────────────────────────────────────────────────────────────────┘
┌─addInterval(toIntervalDay(2), toIntervalDay(1))─┐
│ (3)                                             │
└─────────────────────────────────────────────────┘

addMicroseconds

自 v22.6 引入

将指定数量的微秒加到日期时间值,或其字符串编码形式的日期时间值上。

语法

addMicroseconds(datetime, num)

参数

返回值

返回 date_time 加上 num 微秒后的值,类型为 DateTime64

示例

为不同的日期时间类型添加微秒

WITH
    toDateTime('2024-01-01 00:00:00') AS date_time,
    '2024-01-01 00:00:00' AS date_time_string
SELECT
    addMicroseconds(date_time, 1000000) AS add_microseconds_with_date_time,
    addMicroseconds(date_time_string, 1000000) AS add_microseconds_with_date_time_string
┌─add_microseconds_with_date_time─┬─add_microseconds_with_date_time_string─┐
│      2024-01-01 00:00:01.000000 │             2024-01-01 00:00:01.000000 │
└─────────────────────────────────┴────────────────────────────────────────┘

使用替代的 INTERVAL 语法

SELECT dateAdd('1998-06-16'::DateTime, INTERVAL 10 microsecond)
┌─plus(CAST('19⋯osecond(10))─┐
│ 1998-06-16 00:00:00.000010 │
└────────────────────────────┘

addMilliseconds

引入版本:v22.6

将指定的毫秒数添加到带时间的日期或字符串形式的带时间日期上。

语法

addMilliseconds(datetime, num)

参数

返回值

返回值为 datetime 加上 num 毫秒后的结果,类型为 DateTime64

示例

为不同的日期时间类型添加毫秒

WITH
    toDateTime('2024-01-01 00:00:00') AS date_time,
    '2024-01-01 00:00:00' AS date_time_string
SELECT
    addMilliseconds(date_time, 1000) AS add_milliseconds_with_date_time,
    addMilliseconds(date_time_string, 1000) AS add_milliseconds_with_date_time_string
┌─add_milliseconds_with_date_time─┬─add_milliseconds_with_date_time_string─┐
│         2024-01-01 00:00:01.000 │                2024-01-01 00:00:01.000 │
└─────────────────────────────────┴────────────────────────────────────────┘

使用另一种 INTERVAL 语法

SELECT dateAdd('1998-06-16'::DateTime, INTERVAL 10 millisecond)
┌─plus(CAST('1⋯second(10))─┐
│  1998-06-16 00:00:00.010 │
└──────────────────────────┘

addMinutes

自 v1.1 起引入

将指定的分钟数加到日期、日期时间,或其字符串表示形式上。

语法

addMinutes(datetime, num)

参数

返回值

返回在 datetime 基础上加上 num 分钟后的结果,类型为 DateTimeDateTime64(3)

示例

为不同的日期类型增加分钟数

WITH
    toDate('2024-01-01') AS date,
    toDateTime('2024-01-01 00:00:00') AS date_time,
    '2024-01-01 00:00:00' AS date_time_string
SELECT
    addMinutes(date, 20) AS add_minutes_with_date,
    addMinutes(date_time, 20) AS add_minutes_with_date_time,
    addMinutes(date_time_string, 20) AS add_minutes_with_date_time_string
┌─add_minutes_with_date─┬─add_minutes_with_date_time─┬─add_minutes_with_date_time_string─┐
│   2024-01-01 00:20:00 │        2024-01-01 00:20:00 │           2024-01-01 00:20:00.000 │
└───────────────────────┴────────────────────────────┴───────────────────────────────────┘

使用替代的 INTERVAL 语法

SELECT dateAdd('1998-06-16'::Date, INTERVAL 10 minute)
┌─plus(CAST('1⋯Minute(10))─┐
│      1998-06-16 00:10:00 │
└──────────────────────────┘

addMonths

自 v1.1 起引入

为日期、日期时间或以字符串编码的日期或日期时间添加指定数量的月份。

语法

addMonths(datetime, num)

参数

返回值

返回 datetime 加上 num 个月后的结果。类型为 DateDate32DateTimeDateTime64

示例

为不同日期类型添加月份

WITH
    toDate('2024-01-01') AS date,
    toDateTime('2024-01-01 00:00:00') AS date_time,
    '2024-01-01 00:00:00' AS date_time_string
SELECT
    addMonths(date, 6) AS add_months_with_date,
    addMonths(date_time, 6) AS add_months_with_date_time,
    addMonths(date_time_string, 6) AS add_months_with_date_time_string
┌─add_months_with_date─┬─add_months_with_date_time─┬─add_months_with_date_time_string─┐
│           2024-07-01 │       2024-07-01 00:00:00 │          2024-07-01 00:00:00.000 │
└──────────────────────┴───────────────────────────┴──────────────────────────────────┘

使用另一种 INTERVAL 语法

SELECT dateAdd('1998-06-16'::Date, INTERVAL 10 month)
┌─plus(CAST('1⋯lMonth(10))─┐
│               1999-04-16 │
└──────────────────────────┘

addNanoseconds

自 v22.6 引入

将指定数量的纳秒添加到日期时间值,或字符串编码的日期时间值。

语法

addNanoseconds(datetime, num)

参数

返回值

返回 datetime 加上 num 个纳秒后的值,类型为 DateTime64

示例

为不同的日期时间类型添加纳秒数

WITH
    toDateTime('2024-01-01 00:00:00') AS date_time,
    '2024-01-01 00:00:00' AS date_time_string
SELECT
    addNanoseconds(date_time, 1000) AS add_nanoseconds_with_date_time,
    addNanoseconds(date_time_string, 1000) AS add_nanoseconds_with_date_time_string
┌─add_nanoseconds_with_date_time─┬─add_nanoseconds_with_date_time_string─┐
│  2024-01-01 00:00:00.000001000 │         2024-01-01 00:00:00.000001000 │
└────────────────────────────────┴───────────────────────────────────────┘

使用另一种 INTERVAL 语法

SELECT dateAdd('1998-06-16'::DateTime, INTERVAL 1000 nanosecond)
┌─plus(CAST('199⋯osecond(1000))─┐
│ 1998-06-16 00:00:00.000001000 │
└───────────────────────────────┘

addQuarters

新增于:v20.1

在日期、日期时间或其字符串形式上增加指定数量的季度。

语法

addQuarters(datetime, num)

参数

返回值

返回在 datetime 上加上 num 个季度后的结果,类型为 DateDate32DateTimeDateTime64

示例

为不同日期类型添加季度

WITH
    toDate('2024-01-01') AS date,
    toDateTime('2024-01-01 00:00:00') AS date_time,
    '2024-01-01 00:00:00' AS date_time_string
SELECT
    addQuarters(date, 1) AS add_quarters_with_date,
    addQuarters(date_time, 1) AS add_quarters_with_date_time,
    addQuarters(date_time_string, 1) AS add_quarters_with_date_time_string
┌─add_quarters_with_date─┬─add_quarters_with_date_time─┬─add_quarters_with_date_time_string─┐
│             2024-04-01 │         2024-04-01 00:00:00 │            2024-04-01 00:00:00.000 │
└────────────────────────┴─────────────────────────────┴────────────────────────────────────┘

使用另一种 INTERVAL 语法

SELECT dateAdd('1998-06-16'::Date, INTERVAL 10 quarter)
┌─plus(CAST('1⋯uarter(10))─┐
│               2000-12-16 │
└──────────────────────────┘

addSeconds

自 v1.1 起引入

将指定数量的秒数加到日期、日期时间,或其字符串表示形式的日期/日期时间上。

语法

addSeconds(datetime, num)

参数

返回值

返回在 datetime 的基础上增加 num 秒后的值,类型为 DateTimeDateTime64(3)

示例

为不同日期类型增加秒数

WITH
    toDate('2024-01-01') AS date,
    toDateTime('2024-01-01 00:00:00') AS date_time,
    '2024-01-01 00:00:00' AS date_time_string
SELECT
    addSeconds(date, 30) AS add_seconds_with_date,
    addSeconds(date_time, 30) AS add_seconds_with_date_time,
    addSeconds(date_time_string, 30) AS add_seconds_with_date_time_string
┌─add_seconds_with_date─┬─add_seconds_with_date_time─┬─add_seconds_with_date_time_string─┐
│   2024-01-01 00:00:30 │        2024-01-01 00:00:30 │           2024-01-01 00:00:30.000 │
└───────────────────────┴────────────────────────────┴───────────────────────────────────┘

使用另一种 INTERVAL 语法

SELECT dateAdd('1998-06-16'::Date, INTERVAL 10 second)
┌─dateAdd('1998-06-16'::Date, INTERVAL 10 second)─┐
│                             1998-06-16 00:00:10 │
└─────────────────────────────────────────────────┘

addTupleOfIntervals

引入于:v22.11

按顺序将一个时间间隔元组加到日期或日期时间上。

语法

addTupleOfIntervals(datetime, intervals)

参数

返回值

返回加上 intervals 后的 date 值,类型为 DateDate32DateTimeDateTime64

示例

向日期添加时间间隔元组

WITH toDate('2018-01-01') AS date
SELECT addTupleOfIntervals(date, (INTERVAL 1 DAY, INTERVAL 1 MONTH, INTERVAL 1 YEAR))
┌─addTupleOfIntervals(date, (toIntervalDay(1), toIntervalMonth(1), toIntervalYear(1)))─┐
│                                                                           2019-02-02 │
└──────────────────────────────────────────────────────────────────────────────────────┘

addWeeks

引入版本:v1.1

向日期、日期时间或其字符串表示形式添加指定的周数。

语法

addWeeks(datetime, num)

参数

返回值

返回 datetime 加上 num 周后的结果。DateDate32DateTimeDateTime64

示例

为不同日期类型增加周数

WITH
    toDate('2024-01-01') AS date,
    toDateTime('2024-01-01 00:00:00') AS date_time,
    '2024-01-01 00:00:00' AS date_time_string
SELECT
    addWeeks(date, 5) AS add_weeks_with_date,
    addWeeks(date_time, 5) AS add_weeks_with_date_time,
    addWeeks(date_time_string, 5) AS add_weeks_with_date_time_string
┌─add_weeks_with_date─┬─add_weeks_with_date_time─┬─add_weeks_with_date_time_string─┐
│          2024-02-05 │      2024-02-05 00:00:00 │         2024-02-05 00:00:00.000 │
└─────────────────────┴──────────────────────────┴─────────────────────────────────┘

使用其他 INTERVAL 语法

SELECT dateAdd('1998-06-16'::Date, INTERVAL 10 week)
┌─plus(CAST('1⋯alWeek(10))─┐
│               1998-08-25 │
└──────────────────────────┘

addYears

自 v1.1 版本引入

为日期、日期时间或其字符串表示形式增加指定的年数。

语法

addYears(datetime, num)

参数

返回值

返回 datetime 加上 num 年后的值,类型为 DateDate32DateTimeDateTime64

示例

为不同日期类型增加年份

WITH
    toDate('2024-01-01') AS date,
    toDateTime('2024-01-01 00:00:00') AS date_time,
    '2024-01-01 00:00:00' AS date_time_string
SELECT
    addYears(date, 1) AS add_years_with_date,
    addYears(date_time, 1) AS add_years_with_date_time,
    addYears(date_time_string, 1) AS add_years_with_date_time_string
┌─add_years_with_date─┬─add_years_with_date_time─┬─add_years_with_date_time_string─┐
│          2025-01-01 │      2025-01-01 00:00:00 │         2025-01-01 00:00:00.000 │
└─────────────────────┴──────────────────────────┴─────────────────────────────────┘

使用另一种 INTERVAL 语法

SELECT dateAdd('1998-06-16'::Date, INTERVAL 10 year)
┌─plus(CAST('1⋯alYear(10))─┐
│               2008-06-16 │
└──────────────────────────┘

age

引入版本:v23.1

返回 startdateenddate 之差在指定单位下的数值部分。 该差值以 1 纳秒的精度进行计算。

例如,2021-12-29 与 2022-01-01 之间的差值,对天数单位为 3 天, 对月份单位为 0 个月,对年份单位为 0 年。

作为 age 的替代方案,参见函数 dateDiff

语法

age('unit', startdate, enddate[, timezone])

参数

  • unit — 结果的时间间隔单位类型。
UnitPossible values
nanosecondnanosecond, nanoseconds, ns
microsecondmicrosecond, microseconds, us, u
millisecondmillisecond, milliseconds, ms
secondsecond, seconds, ss, s
minuteminute, minutes, mi, n
hourhour, hours, hh, h
dayday, days, dd, d
weekweek, weeks, wk, ww
monthmonth, months, mm, m
quarterquarter, quarters, qq, q
yearyear, years, yyyy, yy
  • startdate — 要减去的第一个时间值(减数)。DateDate32DateTimeDateTime64
  • enddate — 要从中减去的第二个时间值(被减数)。DateDate32DateTimeDateTime64
  • timezone — 可选。时区名称。如果指定,则同时应用于 startdateenddate。如果未指定,则使用 startdateenddate 自身的时区。如果二者不相同,则结果未定义。String

返回值

返回用 unit 表示的 enddatestartdate 之间的差值。Int32

示例

按小时计算年龄

SELECT age('hour', toDateTime('2018-01-01 22:30:00'), toDateTime('2018-01-02 23:00:00'))
┌─age('hour', toDateTime('2018-01-01 22:30:00'), toDateTime('2018-01-02 23:00:00'))─┐
│                                                                                24 │
└───────────────────────────────────────────────────────────────────────────────────┘

按不同单位计算年龄

SELECT
    toDate('2022-01-01') AS e,
    toDate('2021-12-29') AS s,
    age('day', s, e) AS day_age,
    age('month', s, e) AS month_age,
    age('year', s, e) AS year_age
┌──────────e─┬──────────s─┬─day_age─┬─month_age─┬─year_age─┐
│ 2022-01-01 │ 2021-12-29 │       3 │         0 │        0 │
└────────────┴────────────┴─────────┴───────────┴──────────┘

changeDay

自 v24.7 引入

更改日期或日期时间值中的“日”部分。

语法

changeDay(date_or_datetime, value)

参数

返回值

返回与 date_or_datetime 类型相同、且其日期中的“日”部分已被修改的值。DateDate32DateTimeDateTime64

示例

用法示例

SELECT changeDay('2024-01-31'::DateTime, 15)
2024-01-15 00:00:00

changeHour

自 v24.7 起引入

更改日期或日期时间值的小时部分。

语法

changeHour(date_or_datetime, value)

参数

返回值

返回与 date_or_datetime 类型相同、但已修改小时部分的值。DateTimeDateTime64

示例

用法示例

SELECT changeHour('2024-01-01 12:00:00'::DateTime, 5)
2024-01-01 05:00:00

changeMinute

引入于:v24.7

更改 datedate time 的分钟部分。

语法

changeMinute(date_or_datetime, value)

参数

返回值

返回与 date_or_datetime 类型相同、但分钟部分已被修改的值。DateTimeDateTime64

示例

使用示例

SELECT changeMinute('2024-01-01 12:30:00'::DateTime, 45)
2024-01-01 12:45:00

changeMonth

引入版本:v24.7

更改日期或日期时间的月份部分。

语法

changeMonth(date_or_datetime, value)

参数

返回值

返回与 date_or_datetime 类型相同、但月份部分已被修改的值。DateDate32DateTimeDateTime64

示例

使用示例

SELECT changeMonth('2024-01-01'::DateTime, 12)
2024-12-01 00:00:00

changeSecond

自 v24.7 版本引入

更改日期或日期时间的秒部分。

语法

changeSecond(date_or_datetime, value)

参数

返回值

返回一个与 date_or_datetime 类型相同但秒部分已被修改的值。DateTimeDateTime64

示例

用法示例

SELECT changeSecond('2024-01-01 12:30:45'::DateTime, 15)
2024-01-01 12:30:15

changeYear

自 v24.7 起引入

修改日期或日期时间的年份部分。

语法

changeYear(date_or_datetime, value)

参数

返回值

返回与 date_or_datetime 类型相同、但年份部分已修改的值。DateDate32DateTimeDateTime64

示例

用法示例

SELECT changeYear('2024-01-01'::DateTime, 2023)
2023-01-01 00:00:00

dateDiff

自 v23.4 引入

返回在 startdateenddate 之间跨越的指定 unit 边界的数量。 差值是使用相对单位计算的。例如,2021-12-29 和 2022-01-01 之间的差值,在单位为 day 时是 3 天 (参见 toRelativeDayNum),在单位为 month 时是 1 个月(参见 toRelativeMonthNum),在单位为 year 时是 1 年 (参见 toRelativeYearNum)。

如果指定的单位是 week,则 dateDiff 认为一周从星期一开始。 请注意,此行为不同于函数 toWeek(),后者默认一周从星期日开始。

如需 dateDiff 的替代函数,请参见 age

语法

dateDiff(unit, startdate, enddate[, timezone])

别名: timestampDiff, TIMESTAMP_DIFF, DATE_DIFF, date_diff, timestamp_diff

参数

  • unit — 结果所使用的时间间隔单位类型。
单位可选值
nanosecondnanosecond, nanoseconds, ns
microsecondmicrosecond, microseconds, us, u
millisecondmillisecond, milliseconds, ms
secondsecond, seconds, ss, s
minuteminute, minutes, mi, n
hourhour, hours, hh, h
dayday, days, dd, d
weekweek, weeks, wk, ww
monthmonth, months, mm, m
quarterquarter, quarters, qq, q
yearyear, years, yyyy, yy
  • startdate — 被减去的第一个时间值(减数)。DateDate32DateTimeDateTime64
  • enddate — 用来进行减法运算的第二个时间值(被减数)。DateDate32DateTimeDateTime64
  • timezone — 可选。时区名称。如果指定,则同时应用于 startdateenddate。如果未指定,则使用 startdateenddate 自身的时区。如果二者时区不同,则结果未定义。String

返回值

返回用 unit 表达的 enddatestartdate 之间的差值。Int64

示例

按小时计算日期差

SELECT dateDiff('hour', toDateTime('2018-01-01 22:00:00'), toDateTime('2018-01-02 23:00:00')) AS res
┌─res─┐
│  25 │
└─────┘

以不同单位计算日期间隔

SELECT
    toDate('2022-01-01') AS e,
    toDate('2021-12-29') AS s,
    dateDiff('day', s, e) AS day_diff,
    dateDiff('month', s, e) AS month_diff,
    dateDiff('year', s, e) AS year_diff
┌──────────e─┬──────────s─┬─day_diff─┬─month_diff─┬─year_diff─┐
│ 2022-01-01 │ 2021-12-29 │        3 │          1 │         1 │
└────────────┴────────────┴──────────┴────────────┴───────────┘

dateName

自 v21.7 起引入

返回日期的指定部分。

可选值:

  • 'year'
  • 'quarter'
  • 'month'
  • 'week'
  • 'dayofyear'
  • 'day'
  • 'weekday'
  • 'hour'
  • 'minute'
  • 'second'

语法

dateName(date_part, date[, timezone])

参数

返回值

返回指定的日期部分。String

示例

提取不同的日期部分

WITH toDateTime('2021-04-14 11:22:33') AS date_value
SELECT
    dateName('year', date_value),
    dateName('month', date_value),
    dateName('day', date_value)
┌─dateName('year', date_value)─┬─dateName('month', date_value)─┬─dateName('day', date_value)─┐
│ 2021                         │ April                         │ 14                          │
└──────────────────────────────┴───────────────────────────────┴─────────────────────────────┘

dateTrunc

自 v20.8 版本引入

将日期和时间值截断到指定的日期部分。

语法

dateTrunc(unit, datetime[, timezone])

别名: DATE_TRUNC

参数

  • unit — 截断结果所使用的时间间隔类型。unit 参数不区分大小写。
    Unit兼容性
    nanosecond仅与 DateTime64 兼容
    microsecond仅与 DateTime64 兼容
    millisecond仅与 DateTime64 兼容
    second
    minute
    hour
    day
    week
    month
    quarter
    year
    String
  • datetime — 日期和时间。DateDate32DateTimeDateTime64
  • timezone — 可选。返回值使用的时区名称。如果未指定,则函数使用 datetime 参数的时区。String

返回值

返回截断后的日期时间值。

Unit 参数datetime 参数返回类型
Year, Quarter, Month, WeekDate32 or DateTime64 or Date or DateTimeDate32Date
Day, Hour, Minute, SecondDate32, DateTime64, Date, or DateTimeDateTime64DateTime
Millisecond, Microsecond,AnyDateTime64
Nanosecond精度(scale)为 3、6 或 9

示例

不带时区的截断

SELECT now(), dateTrunc('hour', now());
┌───────────────now()─┬─dateTrunc('hour', now())──┐
│ 2020-09-28 10:40:45 │       2020-09-28 10:00:00 │
└─────────────────────┴───────────────────────────┘

按指定时区进行截断

SELECT now(), dateTrunc('hour', now(), 'Asia/Istanbul');
┌───────────────now()─┬─dateTrunc('hour', now(), 'Asia/Istanbul')──┐
│ 2020-09-28 10:46:26 │                        2020-09-28 13:00:00 │
└─────────────────────┴────────────────────────────────────────────┘

formatDateTime

引入于:v1.1

根据给定的格式字符串格式化日期或日期时间。format 必须是常量表达式,因此同一个结果列中不能使用多种不同的格式。

formatDateTime 使用 MySQL 的日期时间格式样式,参见 MySQL 文档

该函数的反向操作是 parseDateTime

通过占位符,你可以为输出字符串定义格式模板。 下表中的示例列展示了对 2018-01-02 22:33:44 的格式化结果。

占位符说明:

Placeholder描述示例
%a缩写的星期名称(Mon-Sun)Mon
%b缩写的月份名称(Jan-Dec)Jan
%c以整数表示的月份(01-12)01
%C年份除以 100 并向下取整为整数(00-99)20
%d月中的日期,零填充(01-31)02
%D短格式 MM/DD/YY 日期,等价于 %m/%d/%y01/02/18
%e月中的日期,空格填充(1-31)2
%f小数秒123456
%F短格式 YYYY-MM-DD 日期,等价于 %Y-%m-%d2018-01-02
%g与 ISO 8601 对齐的两位数年份格式18
%GISO 周序号使用的四位数年份格式2018
%h12 小时制的小时(01-12)09
%H24 小时制的小时(00-23)22
%i分钟(00-59)33
%I12 小时制的小时(01-12)10
%j一年中的第几天(001-366)002
%k24 小时制的小时(00-23)14
%l12 小时制的小时(01-12)09
%m以整数表示的月份(01-12)01
%M完整的月份名称(January-December)January
%n换行符
%pAM 或 PM 标识PM
%Q季度(1-4)1
%r12 小时制 HH:MM AM/PM 时间,等价于 %h:%i %p10:30 PM
%R24 小时制 HH:MM 时间,等价于 %H:%i22:33
%s秒(00-59)44
%S秒(00-59)44
%t水平制表符
%TISO 8601 时间格式(HH:MM:SS),等价于 %H:%i:%S22:33:44
%uISO 8601 星期几编号,星期一为 1(1-7)2
%VISO 8601 周序号(01-53)01
%w星期几的整数编号,星期日为 0(0-6)2
%W完整的星期名称(Monday-Sunday)Monday
%y年份的后两位数字(00-99)18
%Y年份2018
%z与 UTC 的时差,格式为 +HHMM 或 -HHMM-0500
%%字符 %%
  • 在 ClickHouse 早于 v23.4 的版本中,如果被格式化的值是 Date、Date32 或 DateTime(不含小数秒),或精度为 0 的 DateTime64,则 %f 输出单个零(0)。
  • 在 ClickHouse 早于 v25.1 的版本中,%f 输出的位数等于 DateTime64 的小数精度,而不是固定的 6 位。
  • 在 ClickHouse 早于 v23.4 的版本中,%M 输出的是分钟(00-59),而不是完整的月份名称(January-December)。

语法

formatDateTime(datetime, format[, timezone])

别名DATE_FORMAT

参数

  • datetime — 要格式化的日期或日期时间。DateDate32DateTimeDateTime64
  • format — 带有占位字段的格式字符串。String
  • timezone — 可选。用于格式化时间的时区名称。String

返回值

按照指定的格式返回日期和时间值。String

示例

使用年份占位符格式化日期

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

格式化带小数秒的 DateTime64

SELECT formatDateTime(toDateTime64('2010-01-04 12:34:56.123456', 7), '%f')
┌─formatDateTime(toDateTime64('2010-01-04 12:34:56.123456', 7), '%f')─┐
│ 1234560                                                             │
└─────────────────────────────────────────────────────────────────────┘

按时区格式化

SELECT
    now() AS ts,
    time_zone,
    formatDateTime(ts, '%T', time_zone) AS str_tz_time
FROM system.time_zones
WHERE time_zone LIKE 'Europe%'
LIMIT 10
┌──────────────────ts─┬─time_zone─────────┬─str_tz_time─┐
│ 2023-09-08 19:13:40 │ Europe/Amsterdam  │ 21:13:40    │
│ 2023-09-08 19:13:40 │ Europe/Andorra    │ 21:13:40    │
│ 2023-09-08 19:13:40 │ Europe/Astrakhan  │ 23:13:40    │
│ 2023-09-08 19:13:40 │ Europe/Athens     │ 22:13:40    │
│ 2023-09-08 19:13:40 │ Europe/Belfast    │ 20:13:40    │
│ 2023-09-08 19:13:40 │ Europe/Belgrade   │ 21:13:40    │
│ 2023-09-08 19:13:40 │ Europe/Berlin     │ 21:13:40    │
│ 2023-09-08 19:13:40 │ Europe/Bratislava │ 21:13:40    │
│ 2023-09-08 19:13:40 │ Europe/Brussels   │ 21:13:40    │
│ 2023-09-08 19:13:40 │ Europe/Bucharest  │ 22:13:40    │
└─────────────────────┴───────────────────┴─────────────┘

formatDateTimeInJodaSyntax

引入版本:v20.1

formatDateTime 类似,但会使用 Joda 风格而不是 MySQL 风格格式化日期时间。请参考 Joda Time 文档

此函数的反向操作为 parseDateTimeInJodaSyntax

通过使用替换字段,你可以为结果字符串定义一个模式。

替换字段:

占位符描述展示形式示例
G纪元文本AD
C纪元的世纪 (>=0)数字20
Y纪元年份 (>=0)1996
xweekyear(尚不支持)1996
wweekyear 的周(尚不支持)数字27
e一周中的第几天数字2
E一周中的星期文本Tuesday; Tue
y1996
D一年中的第几天数字189
M一年中的月份July; Jul; 07
d一个月中的第几天数字10
a上下午文本PM
K上下午中的小时 (0~11)数字0
h上下午中的时钟小时 (1~12)数字12
H一天中的小时 (0~23)数字0
k一天中的时钟小时 (1~24)数字24
m一小时中的分钟数字30
s一分钟中的秒数字55
S秒的小数部分数字978
z时区文本Eastern Standard Time; EST
Z时区偏移量偏移量-0800; -0812
'文本转义分隔符
''单引号字面量'

语法

formatDateTimeInJodaSyntax(datetime, format[, timezone])

参数

  • datetime — 要格式化的日期或日期时间值。DateTimeDateDate32DateTime64
  • format — 含有 Joda 风格占位符的格式字符串。String
  • timezone — 可选。用于格式化时间的时区名称。String

返回值

根据指定的格式返回时间和日期值。String

示例

使用 Joda 语法格式化日期时间

SELECT formatDateTimeInJodaSyntax(toDateTime('2010-01-04 12:34:56'), 'yyyy-MM-dd HH:mm:ss')
┌─formatDateTimeInJodaSyntax(toDateTime('2010-01-04 12:34:56'), 'yyyy-MM-dd HH:mm:ss')─┐
│ 2010-01-04 12:34:56                                                                     │
└─────────────────────────────────────────────────────────────────────────────────────────┘

fromDaysSinceYearZero

引入于:v23.11

对于给定的自公元 0000 年 1 月 1 日以来经过的天数,返回在 ISO 8601 定义的推前公历(proleptic Gregorian calendar)中的对应日期。

该计算方式与 MySQL 的 FROM_DAYS() 函数相同。如果结果无法用 Date 类型的取值范围表示,则行为未定义。

语法

fromDaysSinceYearZero(days)

别名FROM_DAYS

参数

  • days — 自第 0 年起经过的天数。UInt32

返回值

返回自第 0 年起经过指定天数所对应的日期。Date

示例

将自第 0 年起的天数转换为日期

SELECT
fromDaysSinceYearZero(739136) AS date1,
fromDaysSinceYearZero(toDaysSinceYearZero(toDate('2023-09-08'))) AS date2
┌──────date1─┬──────date2─┐
│ 2023-09-08 │ 2023-09-08 │
└────────────┴────────────┘

fromDaysSinceYearZero32

引入于:v23.11

对于自公元0000 年 1 月 1 日起经过的给定天数,返回在 ISO 8601 定义的前推公历中的对应日期。 该计算方式与 MySQL 中的 FROM_DAYS() 函数相同。如果结果无法在 Date32 类型的取值范围内表示,则其行为未定义。

语法

fromDaysSinceYearZero32(days)

参数

  • days — 自公元 0 年以来经过的天数。UInt32

返回值

返回与自公元 0 年以来经过的天数相对应的日期。Date32

示例

将自公元 0 年以来的天数转换为日期

SELECT
fromDaysSinceYearZero32(739136) AS date1,
fromDaysSinceYearZero32(toDaysSinceYearZero(toDate('2023-09-08'))) AS date2
┌──────date1─┬──────date2─┐
│ 2023-09-08 │ 2023-09-08 │
└────────────┴────────────┘

fromModifiedJulianDay

自 v21.1 起引入

将一个修正儒略日日数转换为前推格里高利历中的文本日期,格式为 YYYY-MM-DD。该函数支持的日数范围为 -6789412973483(分别表示 0000-01-01 和 9999-12-31)。如果日数超出该范围,将抛出异常。

语法

fromModifiedJulianDay(day)

参数

  • day — 修正儒略日(Modified Julian Day)数值。(U)Int*

返回值

返回日期的文本表示形式。String

示例

将修正儒略日转换为日期

SELECT fromModifiedJulianDay(58849)
┌─fromModifiedJulianDay(58849)─┐
│ 2020-01-01                   │
└──────────────────────────────┘

fromModifiedJulianDayOrNull

引入于:v21.1

类似于 fromModifiedJulianDay(),但不会抛出异常,而是返回 NULL

语法

fromModifiedJulianDayOrNull(day)

参数

  • day — 修正儒略日数值。(U)Int*

返回值

day 参数有效时,返回日期的文本形式,否则返回 nullNullable(String)

示例

将修正儒略日转换为日期并处理空值

SELECT fromModifiedJulianDayOrNull(58849);
SELECT fromModifiedJulianDayOrNull(60000000); -- 无效参数,返回 NULL
┌─fromModified⋯Null(58849)─┐
│ 2020-01-01               │
└──────────────────────────┘
┌─fromModified⋯l(60000000)─┐
│ ᴺᵁᴸᴸ                     │
└──────────────────────────┘

fromUTCTimestamp

自 v22.1 起提供

将 UTC 时区的日期或日期时间值转换为指定时区的日期或日期时间值。此函数主要用于与 Apache Spark 和类似框架的兼容性。

语法

fromUTCTimestamp(datetime, time_zone)

别名: from_utc_timestamp

参数

  • datetime — 一个日期或日期时间的常量值或表达式。DateTimeDateTime64
  • time_zone — 表示时区的 String 类型常量值或表达式。String

返回值

返回指定时区下的 DateTime/DateTime64 值。DateTimeDateTime64

示例

将 UTC 时间转换为指定时区的时间

SELECT fromUTCTimestamp(toDateTime64('2023-03-16 10:00:00', 3), 'Asia/Shanghai')
┌─fromUTCTimestamp(toDateTime64('2023-03-16 10:00:00',3), 'Asia/Shanghai')─┐
│                                                 2023-03-16 18:00:00.000 │
└─────────────────────────────────────────────────────────────────────────┘

fromUnixTimestamp

引入版本:v20.8

此函数将 Unix 时间戳转换为日历日期和一天中的时间。

可以以两种方式调用:

语法

fromUnixTimestamp(timestamp)
fromUnixTimestamp(timestamp[, format[, timezone]])

别名FROM_UNIXTIME

参数

  • timestamp — Unix 时间戳或日期/日期时间值。(U)Int*DateDate32DateTimeDateTime64
  • format — 可选。用于控制输出格式的常量格式字符串。String
  • timezone — 可选。表示时区的常量字符串。String

返回值

当以一个参数调用时,返回该时间戳对应的 DateTime;当以两个或三个参数调用时,返回 StringDateTimeString

示例

将 Unix 时间戳转换为 DateTime

SELECT fromUnixTimestamp(423543535)
┌─fromUnixTimestamp(423543535)─┐
│          1983-06-04 10:58:55 │
└──────────────────────────────┘

按格式转换 Unix 时间戳

SELECT fromUnixTimestamp(1234334543, '%Y-%m-%d %R:%S') AS DateTime
┌─DateTime────────────┐
│ 2009-02-11 14:42:23 │
└─────────────────────┘

fromUnixTimestampInJodaSyntax

自 v23.1 引入

此函数将 Unix 时间戳转换为日历日期和一天中的时间。

它可以通过两种方式调用:

当只传入一个 Integer 类型的参数时,函数返回 DateTime 类型的值,其行为等同于 toDateTime

当传入两个或三个参数时,其中第一个参数为 IntegerDateDate32DateTimeDateTime64 类型的值,第二个参数为常量格式字符串,第三个参数为可选的常量时区字符串,函数返回 String 类型的值,其行为等同于 formatDateTimeInJodaSyntax。在这种情况下,使用的是 Joda 日期时间格式样式

语法

fromUnixTimestampInJodaSyntax(timestamp)
fromUnixTimestampInJodaSyntax(timestamp, format[, timezone])

参数

  • timestamp — Unix 时间戳或日期/时间值。(U)Int*DateDate32DateTimeDateTime64
  • format — 可选。使用 Joda 语法的常量格式字符串,用于控制输出格式。String
  • timezone — 可选。表示时区的常量字符串。String

返回值

使用一个参数调用时返回带时间的日期类型,使用两个或三个参数调用时返回字符串类型。DateTimeString

示例

使用 Joda 格式转换 Unix 时间戳

SELECT fromUnixTimestampInJodaSyntax(1234334543, 'yyyy-MM-dd HH:mm:ss', 'UTC') AS DateTime
┌─DateTime────────────┐
│ 2009-02-11 06:42:23 │
└─────────────────────┘

makeDate

引入版本:v22.6

根据以下两种方式之一创建一个 Date

  • 年、月和日
  • 年和一年中的第几天

语法

makeDate(年, 月, 日)
makeDate(年, 年积日)

参数

返回值

返回由给定参数构造的 Date 类型值 Date

示例

根据 year、month、day 构造日期

SELECT makeDate(2023, 2, 28) AS date;
┌───────date─┐
│ 2023-02-28 │
└────────────┘

由年份和一年中的第几天计算日期

SELECT makeDate(2023, 42) AS date;
┌───────date─┐
│ 2023-02-11 │
└────────────┘

makeDate32

自 v22.6 起引入

通过以下任一方式创建一个 Date32 值:

  • 年、月和日
  • 年和一年中的第几天

语法

makeDate32(year, month, day)
makeDate32(year, day_of_year)

参数

返回值

返回由提供的参数构造的 Date32 值。

示例

根据年、月、日构造 Date32

SELECT makeDate(2023, 2, 28) AS date;
┌───────date─┐
│ 2023-02-28 │
└────────────┘

根据年份和一年中的第几天生成 Date32

SELECT makeDate(2023, 42) AS date;
┌───────date─┐
│ 2023-02-11 │
└────────────┘

makeDateTime

自 v22.6 引入

根据年份、月份、日期、小时、分钟和秒创建一个 DateTime,可选指定时区。

语法

makeDateTime(year, month, day, hour, minute, second[, timezone])

参数

返回值

返回一个由给定参数构造的 DateTime 值,DateTime

示例

根据 year、month、day、hour、minute、second 构造 DateTime

SELECT makeDateTime(2023, 2, 28, 17, 12, 33) AS DateTime;
┌────────────DateTime─┐
│ 2023-02-28 17:12:33 │
└─────────────────────┘

makeDateTime64

自 v22.6 引入

根据 year、month、day、hour、minute、second 创建一个 DateTime64 值,可选指定小数部分、精度和时区。

语法

makeDateTime64(年, 月, 日, 时, 分, 秒[, 小数部分[, 精度[, 时区]]])

参数

返回值

返回由提供的参数构造的 DateTime64 值。DateTime64

示例

从 year、month、day、hour、minute、second 构造 DateTime64

SELECT makeDateTime64(2023, 5, 15, 10, 30, 45, 779, 5);
┌─makeDateTime64(2023, 5, 15, 10, 30, 45, 779, 5)─┐
│                       2023-05-15 10:30:45.00779 │
└─────────────────────────────────────────────────┘

monthName

引入版本:v22.1

从日期或日期时间值中返回对应的月份名称字符串。

语法

monthName(datetime)

参数

返回值

返回月份名称。String

示例

从日期获取月份名称

WITH toDateTime('2021-04-14 11:22:33') AS date_value
SELECT monthName(date_value)
┌─monthName(date_value)─┐
│ April                 │
└───────────────────────┘

now

引入于:v1.1

返回在查询分析阶段的当前日期和时间。该函数为常量表达式。

语法

now([timezone])

别名: current_timestamp

参数

  • timezone — 可选。返回值使用的时区名称。String

返回值

返回当前日期和时间。DateTime

示例

不指定时区的查询

SELECT now()
┌───────────────now()─┐
│ 2020-10-17 07:42:09 │
└─────────────────────┘

按指定时区查询

SELECT now('Asia/Istanbul')
┌─now('Asia/Istanbul')─┐
│  2020-10-17 10:42:23 │
└──────────────────────┘

now64

自 v20.1 起引入

返回在查询分析时刻的当前日期和时间,精度可达到秒的小数部分。该函数是一个常量表达式。

语法

now64([scale[, timezone]])

参数

  • scale — 可选。刻度(精度):10^-scale 秒。有效范围:[0 : 9]。通常使用:3(默认,毫秒)、6(微秒)、9(纳秒)。UInt8
  • timezone — 可选。返回值的时区名称。String

返回值

返回精确到亚秒级的当前日期和时间。DateTime64

示例

带默认精度和自定义精度的查询

SELECT now64(), now64(9, 'Asia/Istanbul')
┌─────────────────now64()─┬─────now64(9, 'Asia/Istanbul')─┐
│ 2022-08-21 19:34:26.196 │ 2022-08-21 22:34:26.196542766 │
└─────────────────────────┴───────────────────────────────┘

nowInBlock

引入于:v22.8

返回在处理每个数据块时的当前日期和时间。与函数 now 相比,它不是常量表达式,对于长时间运行的查询,不同数据块中返回的值会不同。

在长时间运行的 INSERT SELECT 查询中使用此函数来生成当前时间是合理的。

语法

nowInBlock([timezone])

参数

  • timezone — 可选。返回值使用的时区名称。String

返回值

返回在处理每个数据块时的当前日期和时间。DateTime

示例

与 now() 函数的区别

SELECT
    now(),
    nowInBlock(),
    sleep(1)
FROM numbers(3)
SETTINGS max_block_size = 1
FORMAT PrettyCompactMonoBlock
┌───────────────now()─┬────────nowInBlock()─┬─sleep(1)─┐
│ 2022-08-21 19:41:19 │ 2022-08-21 19:41:19 │        0 │
│ 2022-08-21 19:41:19 │ 2022-08-21 19:41:20 │        0 │
│ 2022-08-21 19:41:19 │ 2022-08-21 19:41:21 │        0 │
└─────────────────────┴─────────────────────┴──────────┘

nowInBlock64

引入于:v25.8

以毫秒为单位返回在处理每个数据块时的当前日期和时间。与函数 now64 不同,它不是常量表达式,对于运行时间较长的查询,在不同数据块中返回的值会有所不同。

在运行时间较长的 INSERT SELECT 查询中,可以使用此函数生成当前时间。

语法

nowInBlock([scale[, timezone]])

参数

  • scale — 可选。刻度(精度):10^-precision 秒。有效范围:[0 : 9]。通常使用的值为 3(默认,毫秒)、6(微秒)、9(纳秒)。UInt8
  • timezone — 可选。返回值所使用的时区名称。String

返回值

以亚秒级精度返回在处理每个数据块时的当前日期和时间。DateTime64

示例

与 now64() 函数的区别

SELECT
    now64(),
    nowInBlock64(),
    sleep(1)
FROM numbers(3)
SETTINGS max_block_size = 1
FORMAT PrettyCompactMonoBlock
┌─────────────────now64()─┬──────────nowInBlock64()─┬─sleep(1)─┐
│ 2025-07-29 17:07:29.526 │ 2025-07-29 17:07:29.534 │        0 │
│ 2025-07-29 17:07:29.526 │ 2025-07-29 17:07:30.535 │        0 │
│ 2025-07-29 17:07:29.526 │ 2025-07-29 17:07:31.535 │        0 │
└─────────────────────────┴─────────────────────────┴──────────┘

serverTimezone

引入于:v23.6

返回服务器的时区,即 timezone 设置的值。 如果在分布式表的上下文中执行该函数,则会生成一个普通列,其值分别对应各个分片。否则,它会返回一个常量值。

语法

serverTimeZone()

别名: serverTimeZone

参数

返回值

返回服务器所在的时区,类型为 String

示例

使用示例

SELECT serverTimeZone()
┌─serverTimeZone()─┐
│ UTC              │
└──────────────────┘

subDate

自 v23.9 版本引入

从给定的日期、日期时间或字符串形式的日期或日期时间中减去时间间隔。 如果减法结果超出该数据类型的取值范围,则结果未定义。

语法

subDate(datetime, interval)

参数

返回值

返回通过从 datetime 中减去 interval 得到的日期或日期时间值。DateDate32DateTimeDateTime64

示例

从日期中减去时间间隔

SELECT subDate(toDate('2018-01-01'), INTERVAL 3 YEAR)
┌─subDate(toDate('2018-01-01'), toIntervalYear(3))─┐
│                                       2015-01-01 │
└──────────────────────────────────────────────────┘

subtractDays

引入版本:v1.1

从日期、日期时间值或其字符串表示中减去指定的天数。

语法

subtractDays(datetime, num)

参数

返回值

返回 datetime 减去 num 天后的值。类型为 DateDate32DateTimeDateTime64

示例

对不同日期类型减去天数

WITH
    toDate('2024-01-01') AS date,
    toDateTime('2024-01-01 00:00:00') AS date_time,
    '2024-01-01 00:00:00' AS date_time_string
SELECT
    subtractDays(date, 31) AS subtract_days_with_date,
    subtractDays(date_time, 31) AS subtract_days_with_date_time,
    subtractDays(date_time_string, 31) AS subtract_days_with_date_time_string
┌─subtract_days_with_date─┬─subtract_days_with_date_time─┬─subtract_days_with_date_time_string─┐
│              2023-12-01 │          2023-12-01 00:00:00 │             2023-12-01 00:00:00.000 │
└─────────────────────────┴──────────────────────────────┴─────────────────────────────────────┘

使用另一种 INTERVAL 语法

SELECT dateSub('1998-06-16'::Date, INTERVAL 10 day)
┌─minus(CAST('⋯valDay(10))─┐
│               1998-06-06 │
└──────────────────────────┘

subtractHours

引入版本:v1.1

从日期、日期时间或字符串形式的日期/日期时间中减去指定的小时数。

语法

subtractHours(datetime, num)

参数

返回值

返回 datetime 减去 num 小时后的结果,类型为 DateTimeDateTime64(3)

示例

从不同日期类型中减去小时数

WITH
    toDate('2024-01-01') AS date,
    toDateTime('2024-01-01 00:00:00') AS date_time,
    '2024-01-01 00:00:00' AS date_time_string
SELECT
    subtractHours(date, 12) AS subtract_hours_with_date,
    subtractHours(date_time, 12) AS subtract_hours_with_date_time,
    subtractHours(date_time_string, 12) AS subtract_hours_with_date_time_string
┌─subtract_hours_with_date─┬─subtract_hours_with_date_time─┬─subtract_hours_with_date_time_string─┐
│      2023-12-31 12:00:00 │           2023-12-31 12:00:00 │              2023-12-31 12:00:00.000 │
└──────────────────────────┴───────────────────────────────┴──────────────────────────────────────┘

使用其他 INTERVAL 语法

SELECT dateSub('1998-06-16'::Date, INTERVAL 10 hour)
┌─minus(CAST('⋯alHour(10))─┐
│      1998-06-15 14:00:00 │
└──────────────────────────┘

subtractInterval

自 v22.11 引入

将一个取反的间隔值加到另一个间隔或间隔元组中。

注意:相同类型的间隔会被合并为单个间隔。例如,如果传入 toIntervalDay(2)toIntervalDay(1),则结果为 (1) 而不是 (2,1)

语法

subtractInterval(interval_1, interval_2)

参数

  • interval_1 — 第一个时间间隔,或由时间间隔组成的元组。IntervalTuple(Interval)
  • interval_2 — 要取负的第二个时间间隔。Interval

返回值

返回由时间间隔组成的元组 Tuple(T)

示例

时间间隔相减

SELECT subtractInterval(INTERVAL 1 DAY, INTERVAL 1 MONTH);
SELECT subtractInterval((INTERVAL 1 DAY, INTERVAL 1 YEAR), INTERVAL 1 MONTH);
SELECT subtractInterval(INTERVAL 2 DAY, INTERVAL 1 DAY);
┌─subtractInterval(toIntervalDay(1), toIntervalMonth(1))─┐
│ (1,-1)                                                 │
└────────────────────────────────────────────────────────┘
┌─subtractInterval((toIntervalDay(1), toIntervalYear(1)), toIntervalMonth(1))─┐
│ (1,1,-1)                                                                    │
└─────────────────────────────────────────────────────────────────────────────┘
┌─subtractInterval(toIntervalDay(2), toIntervalDay(1))─┐
│ (1)                                                  │
└──────────────────────────────────────────────────────┘

subtractMicroseconds

自 v22.6 起引入

从日期时间值或字符串形式的日期时间值中减去指定数量的微秒。

语法

subtractMicroseconds(datetime, num)

参数

返回值

返回 datetime 减去 num 微秒后的结果,类型为 DateTime64

示例

从不同的日期时间类型中减去微秒

WITH
    toDateTime('2024-01-01 00:00:00') AS date_time,
    '2024-01-01 00:00:00' AS date_time_string
SELECT
    subtractMicroseconds(date_time, 1000000) AS subtract_microseconds_with_date_time,
    subtractMicroseconds(date_time_string, 1000000) AS subtract_microseconds_with_date_time_string
┌─subtract_microseconds_with_date_time─┬─subtract_microseconds_with_date_time_string─┐
│           2023-12-31 23:59:59.000000 │                  2023-12-31 23:59:59.000000 │
└──────────────────────────────────────┴─────────────────────────────────────────────┘

使用另一种 INTERVAL 语法

SELECT dateSub('1998-06-16'::DateTime, INTERVAL 10 microsecond)
┌─minus(CAST('1⋯osecond(10))─┐
│ 1998-06-15 23:59:59.999990 │
└────────────────────────────┘

subtractMilliseconds

自 v22.6 起引入

从日期时间值或其字符串形式中减去指定的毫秒数。

语法

subtractMilliseconds(datetime, num)

参数

返回值

返回 datetime 减去 num 毫秒后的结果,类型为 DateTime64

示例

从不同类型的日期时间值中减去毫秒数

WITH
    toDateTime('2024-01-01 00:00:00') AS date_time,
    '2024-01-01 00:00:00' AS date_time_string
SELECT
    subtractMilliseconds(date_time, 1000) AS subtract_milliseconds_with_date_time,
    subtractMilliseconds(date_time_string, 1000) AS subtract_milliseconds_with_date_time_string
┌─subtract_milliseconds_with_date_time─┬─subtract_milliseconds_with_date_time_string─┐
│              2023-12-31 23:59:59.000 │                     2023-12-31 23:59:59.000 │
└──────────────────────────────────────┴─────────────────────────────────────────────┘

使用另一种 INTERVAL 语法

SELECT dateSub('1998-06-16'::DateTime, INTERVAL 10 millisecond)
┌─minus(CAST('⋯second(10))─┐
│  1998-06-15 23:59:59.990 │
└──────────────────────────┘

subtractMinutes

引入版本:v1.1

从日期、日期时间或其字符串表示中减去指定的分钟数。

语法

subtractMinutes(datetime, num)

参数

返回值

返回 datetime 减去 num 分钟后的结果,类型为 DateTimeDateTime64(3)

示例

从不同日期类型中减去分钟数

WITH
    toDate('2024-01-01') AS date,
    toDateTime('2024-01-01 00:00:00') AS date_time,
    '2024-01-01 00:00:00' AS date_time_string
SELECT
    subtractMinutes(date, 30) AS subtract_minutes_with_date,
    subtractMinutes(date_time, 30) AS subtract_minutes_with_date_time,
    subtractMinutes(date_time_string, 30) AS subtract_minutes_with_date_time_string
┌─subtract_minutes_with_date─┬─subtract_minutes_with_date_time─┬─subtract_minutes_with_date_time_string─┐
│        2023-12-31 23:30:00 │             2023-12-31 23:30:00 │                2023-12-31 23:30:00.000 │
└────────────────────────────┴─────────────────────────────────┴────────────────────────────────────────┘

使用另一种 INTERVAL 语法

SELECT dateSub('1998-06-16'::Date, INTERVAL 10 minute)
┌─minus(CAST('⋯Minute(10))─┐
│      1998-06-15 23:50:00 │
└──────────────────────────┘

subtractMonths

引入于:v1.1

从日期、日期时间或字符串编码的日期或日期时间中减去指定的月数。

语法

subtractMonths(datetime, num)

参数

返回值

返回 datetime 减去 num 个月后的结果。DateDate32DateTimeDateTime64

示例

对不同日期类型减去月份

WITH
    toDate('2024-01-01') AS date,
    toDateTime('2024-01-01 00:00:00') AS date_time,
    '2024-01-01 00:00:00' AS date_time_string
SELECT
    subtractMonths(date, 1) AS subtract_months_with_date,
    subtractMonths(date_time, 1) AS subtract_months_with_date_time,
    subtractMonths(date_time_string, 1) AS subtract_months_with_date_time_string
┌─subtract_months_with_date─┬─subtract_months_with_date_time─┬─subtract_months_with_date_time_string─┐
│                2023-12-01 │            2023-12-01 00:00:00 │               2023-12-01 00:00:00.000 │
└───────────────────────────┴────────────────────────────────┴───────────────────────────────────────┘

使用另一种 INTERVAL 语法

SELECT dateSub('1998-06-16'::Date, INTERVAL 10 month)
┌─minus(CAST('⋯lMonth(10))─┐
│               1997-08-16 │
└──────────────────────────┘

subtractNanoseconds

自 v20.1 版本引入

从带时间的日期或其字符串表示中减去指定数量的纳秒。

语法

subtractNanoseconds(datetime, num)

参数

返回值

返回 datetime 减去 num 纳秒后的结果,类型为 DateTime64

示例

从不同的日期时间类型中减去纳秒数

WITH
    toDateTime('2024-01-01 00:00:00') AS date_time,
    '2024-01-01 00:00:00' AS date_time_string
SELECT
    subtractNanoseconds(date_time, 1000) AS subtract_nanoseconds_with_date_time,
    subtractNanoseconds(date_time_string, 1000) AS subtract_nanoseconds_with_date_time_string
┌─subtract_nanoseconds_with_date_time─┬─subtract_nanoseconds_with_date_time_string─┐
│       2023-12-31 23:59:59.999999000 │              2023-12-31 23:59:59.999999000 │
└─────────────────────────────────────┴────────────────────────────────────────────┘

使用另一种 INTERVAL 语法

SELECT dateSub('1998-06-16'::DateTime, INTERVAL 10 nanosecond)
┌─minus(CAST('19⋯anosecond(10))─┐
│ 1998-06-15 23:59:59.999999990 │
└───────────────────────────────┘

subtractQuarters

引入于:v20.1

从日期、日期时间或其字符串表示中减去指定数量的季度。

语法

subtractQuarters(datetime, num)

参数

返回值

返回 datetime 减去 num 个季度后的结果,类型为 DateDate32DateTimeDateTime64

示例

对不同日期类型减去季度数

WITH
    toDate('2024-01-01') AS date,
    toDateTime('2024-01-01 00:00:00') AS date_time,
    '2024-01-01 00:00:00' AS date_time_string
SELECT
    subtractQuarters(date, 1) AS subtract_quarters_with_date,
    subtractQuarters(date_time, 1) AS subtract_quarters_with_date_time,
    subtractQuarters(date_time_string, 1) AS subtract_quarters_with_date_time_string
┌─subtract_quarters_with_date─┬─subtract_quarters_with_date_time─┬─subtract_quarters_with_date_time_string─┐
│                  2023-10-01 │              2023-10-01 00:00:00 │                 2023-10-01 00:00:00.000 │
└─────────────────────────────┴──────────────────────────────────┴─────────────────────────────────────────┘

使用另一种 INTERVAL 语法

SELECT dateSub('1998-06-16'::Date, INTERVAL 10 quarter)
┌─minus(CAST('1⋯Quarter(10))─┐
│                1996-09-16 │
└───────────────────────────┘

subtractSeconds

自 v1.1 起引入

从日期、日期时间或字符串编码的日期/日期时间中减去指定的秒数。

语法

subtractSeconds(datetime, num)

参数

返回值

返回 datetime 减去 num 秒后的结果,类型为 DateTimeDateTime64(3)

示例

从不同日期/时间类型中减去秒数

WITH
    toDate('2024-01-01') AS date,
    toDateTime('2024-01-01 00:00:00') AS date_time,
    '2024-01-01 00:00:00' AS date_time_string
SELECT
    subtractSeconds(date, 60) AS subtract_seconds_with_date,
    subtractSeconds(date_time, 60) AS subtract_seconds_with_date_time,
    subtractSeconds(date_time_string, 60) AS subtract_seconds_with_date_time_string
┌─subtract_seconds_with_date─┬─subtract_seconds_with_date_time─┬─subtract_seconds_with_date_time_string─┐
│        2023-12-31 23:59:00 │             2023-12-31 23:59:00 │                2023-12-31 23:59:00.000 │
└────────────────────────────┴─────────────────────────────────┴────────────────────────────────────────┘

使用另一种 INTERVAL 语法

SELECT dateSub('1998-06-16'::Date, INTERVAL 10 second)
┌─minus(CAST('⋯Second(10))─┐
│      1998-06-15 23:59:50 │
└──────────────────────────┘

subtractTupleOfIntervals

自 v22.11 引入

从日期或日期时间值中依次减去一个时间间隔元组中的各个间隔。

语法

subtractTupleOfIntervals(datetime, intervals)

参数

返回值

返回已减去 intervalsdate 值,类型为 DateDate32DateTimeDateTime64

示例

从日期中减去时间间隔元组

WITH toDate('2018-01-01') AS date SELECT subtractTupleOfIntervals(date, (INTERVAL 1 DAY, INTERVAL 1 YEAR))
┌─subtractTupl⋯alYear(1)))─┐
│               2016-12-31 │
└──────────────────────────┘

subtractWeeks

自 v1.1 起提供

从日期、日期时间,或字符串编码的日期/日期时间中减去指定的周数。

语法

subtractWeeks(datetime, num)

参数

返回值

返回 datetime 减去 num 周后的结果,类型为 DateDate32DateTimeDateTime64

示例

对不同日期类型减去周数

```sql title=查询
WITH
    toDate('2024-01-01') AS date,
    toDateTime('2024-01-01 00:00:00') AS date_time,
    '2024-01-01 00:00:00' AS date_time_string
SELECT
    subtractWeeks(date, 1) AS subtract_weeks_with_date,
    subtractWeeks(date_time, 1) AS subtract_weeks_with_date_time,
    subtractWeeks(date_time_string, 1) AS subtract_weeks_with_date_time_string
```

```response title=响应
```
┌─subtract_weeks_with_date─┬─subtract_weeks_with_date_time─┬─subtract_weeks_with_date_time_string─┐
│               2023-12-25 │           2023-12-25 00:00:00 │              2023-12-25 00:00:00.000 │
└──────────────────────────┴───────────────────────────────┴──────────────────────────────────────┘

使用另一种 INTERVAL 语法

SELECT dateSub('1998-06-16'::Date, INTERVAL 10 week)
┌─minus(CAST('⋯alWeek(10))─┐
│               1998-04-07 │
└──────────────────────────┘

subtractYears

引入版本:v1.1

从日期、日期时间或其字符串表示中减去指定的年数。

语法

subtractYears(datetime, num)

参数

返回值

返回 datetime 减去 num 年后的值,类型为 DateDate32DateTimeDateTime64

示例

对不同日期类型减去年份

WITH
    toDate('2024-01-01') AS date,
    toDateTime('2024-01-01 00:00:00') AS date_time,
    '2024-01-01 00:00:00' AS date_time_string
SELECT
    subtractYears(date, 1) AS subtract_years_with_date,
    subtractYears(date_time, 1) AS subtract_years_with_date_time,
    subtractYears(date_time_string, 1) AS subtract_years_with_date_time_string
┌─subtract_years_with_date─┬─subtract_years_with_date_time─┬─subtract_years_with_date_time_string─┐
│               2023-01-01 │           2023-01-01 00:00:00 │              2023-01-01 00:00:00.000 │
└──────────────────────────┴───────────────────────────────┴──────────────────────────────────────┘

使用另一种 INTERVAL 语法

SELECT dateSub('1998-06-16'::Date, INTERVAL 10 year)
┌─minus(CAST('⋯alYear(10))─┐
│               1988-06-16 │
└──────────────────────────┘

timeDiff

引入于:v23.4

返回两个日期或日期时间值之间的差值(以秒为单位)。 差值计算方式为 enddate - startdate

此函数等价于 dateDiff('second', startdate, enddate)

若要按其他单位(小时、天、月等)计算时间差,请改用 dateDiff 函数。

语法

timeDiff(startdate, enddate)

参数

返回值

返回 enddatestartdate 之间以秒为单位的差值。Int64

示例

以秒计算时间差

SELECT timeDiff(toDateTime('2018-01-01 22:00:00'), toDateTime('2018-01-02 23:00:00')) AS res
┌───res─┐
│ 90000 │
└───────┘

计算时间差并换算为小时

SELECT timeDiff(toDateTime('2018-01-01 22:00:00'), toDateTime('2018-01-02 23:00:00')) / 3600 AS hours
┌─hours─┐
│    25 │
└───────┘

等价于按秒计算的 dateDiff

SELECT
    timeDiff(toDateTime('2021-12-29'), toDateTime('2022-01-01')) AS time_diff_result,
    dateDiff('second', toDateTime('2021-12-29'), toDateTime('2022-01-01')) AS date_diff_result
┌─time_diff_result─┬─date_diff_result─┐
│           259200 │           259200 │
└──────────────────┴──────────────────┘

timeSlot

引入于:v1.1

将时间舍入到以 30 分钟为长度的时间区间的起始时刻。

注意

尽管此函数可以接受扩展类型 Date32DateTime64 的值作为参数, 但如果传入超出正常范围(Date 为 1970 年到 2149 年 / DateTime 为 1970 年到 2106 年)的时间,将会产生错误结果。

语法

timeSlot(time[, time_zone])

参数

  • time — 要舍入到半小时间隔起始时刻的时间。DateTimeDate32DateTime64
  • time_zone — 可选。表示时区的 String 类型常量值或表达式。String

返回值

返回按半小时间隔起始时刻舍入后的时间。DateTime

示例

将时间舍入到半小时间隔

SELECT timeSlot(toDateTime('2000-01-02 03:04:05', 'UTC'))
┌─timeSlot(toDateTime('2000-01-02 03:04:05', 'UTC'))─┐
│                                2000-01-02 03:00:00 │
└────────────────────────────────────────────────────┘

timeSlots

引入于:v1.1

对于从 StartTime 开始、持续 Duration 秒的时间区间,该函数返回一个时间点数组,由该区间内按秒为单位、向下取整到步长为 Size 的时间点组成。Size 是可选参数,默认值为 1800(30 分钟)。

例如,在查找对应会话中的页面浏览记录时会用到该函数。

当类型为 DateTime64 时,返回值的小数精度(scale)可能与 StartTime 的精度不同,将采用所有传入参数中最高的精度。

语法

timeSlots(StartTime, Duration[, Size])

参数

  • StartTime — 区间的起始时间。DateTimeDateTime64
  • Duration — 区间的持续时间,单位为秒。UInt32DateTime64
  • Size — 可选。时间片段的长度,单位为秒。默认值为 1800(30 分钟)。UInt32DateTime64

返回值

返回一个由 DateTime/DateTime64 组成的数组(返回类型与 StartTime 的类型一致)。对于 DateTime64,返回值的精度可能与 StartTime 的精度不同——会采用所有传入参数中最高的精度。Array(DateTime)Array(DateTime64)

示例

为一个时间区间生成时间片段

SELECT timeSlots(toDateTime('2012-01-01 12:20:00'), toUInt32(600));
SELECT timeSlots(toDateTime('1980-12-12 21:01:02', 'UTC'), toUInt32(600), 299);
SELECT timeSlots(toDateTime64('1980-12-12 21:01:02.1234', 4, 'UTC'), toDecimal64(600.1, 1), toDecimal64(299, 0))
┌─timeSlots(toDateTime('2012-01-01 12:20:00'), toUInt32(600))─┐
│ ['2012-01-01 12:00:00','2012-01-01 12:30:00']               │
└─────────────────────────────────────────────────────────────┘
┌─timeSlots(toDateTime('1980-12-12 21:01:02', 'UTC'), toUInt32(600), 299)─┐
│ ['1980-12-12 20:56:13','1980-12-12 21:01:12','1980-12-12 21:06:11']     │
└─────────────────────────────────────────────────────────────────────────┘
┌─timeSlots(toDateTime64('1980-12-12 21:01:02.1234', 4, 'UTC'), toDecimal64(600.1, 1), toDecimal64(299, 0))─┐
│ ['1980-12-12 20:56:13.0000','1980-12-12 21:01:12.0000','1980-12-12 21:06:11.0000']                        │
└───────────────────────────────────────────────────────────────────────────────────────────────────────────┘

timestamp

引入于:v23.9

将第一个参数 expr 转换为类型 DateTime64(6)。 如果提供了第二个参数 expr_time,则会在转换后的值上加上指定的时间。

语法

timestamp(expr[, expr_time])

参数

  • expr — 日期或日期时间值。String
  • expr_time — 可选。要加到转换结果上的时间。String

返回值

返回 expr 转换后的值,或在其基础上加上时间后的结果。DateTime64(6)

示例

将日期字符串转换为 DateTime64(6)

SELECT timestamp('2023-12-31') AS ts;
┌─────────────────────────ts─┐
│ 2023-12-31 00:00:00.000000 │
└────────────────────────────┘

在日期字符串中添加时间

SELECT timestamp('2023-12-31 12:00:00', '12:00:00.11') AS ts;
┌─────────────────────────ts─┐
│ 2024-01-01 00:00:00.110000 │
└────────────────────────────┘

timezone

自 v21.4 起引入

返回当前会话的时区名称,或将时区偏移量或名称转换为规范的时区名称。

语法

timezone()

别名: timeZone

参数

  • 无。

返回值

返回规范的时区名称,类型为 String

示例

用法示例

SELECT timezone()
┌─timezone()───────┐
│ Europe/Amsterdam │
└──────────────────┘

timezoneOf

在 v21.4 中引入

返回 DateTimeDateTime64 值的时区名称。

语法

timeZoneOf(datetime)

别名: timeZoneOf

参数

  • datetime — 类型为 DateTimeDateTime64 的值。
  • timezone — 可选。将 datetime 的时区转换到的目标时区名称,类型为 String

返回值

返回 datetime 对应的时区名称,类型为 String

示例

用法示例

SELECT timezoneOf(now());
┌─timezoneOf(now())─┐
│ Europe/Amsterdam  │
└───────────────────┘

timezoneOffset

自 v21.6 引入

返回在指定日期和时间下,相对于 UTC 的时区偏移量(以秒为单位)。
该函数会考虑夏令时以及历史时区变更。

语法

timeZoneOffset(datetime)

别名timeZoneOffset

参数

  • datetime — 需要获取其时区偏移量的日期时间值,类型为 DateTimeDateTime64

返回值

返回相对于 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;
┌────────────────Time─┬─Type─────────────────────────┬─Offset_in_seconds─┬─Offset_in_hours─┐
│ 2021-04-21 10:20:30 │ DateTime('America/New_York') │            -14400 │              -4 │
└─────────────────────┴──────────────────────────────┴───────────────────┴─────────────────┘

toDayOfMonth

引入版本:v1.1

返回 DateDateTime 的当月中的日(1-31)。

语法

toDayOfMonth(datetime)

别名: DAY, DAYOFMONTH

参数

返回值

返回给定日期/时间的“日”(当月中的第几天),类型为 UInt8

示例

使用示例

SELECT toDayOfMonth(toDateTime('2023-04-21 10:20:30'))
┌─toDayOfMonth(toDateTime('2023-04-21 10:20:30'))─┐
│                                              21 │
└─────────────────────────────────────────────────┘

toDayOfWeek

自 v1.1 起引入

返回 DateDateTime 值在一周中的星期编号。

带两个参数的 toDayOfWeek() 形式允许指定一周是从周一还是周日开始, 以及返回值是在 0 到 6 还是 1 到 7 的范围内。

模式一周的第一天范围
0周一1-7:周一 = 1,周二 = 2,…,周日 = 7
1周一0-6:周一 = 0,周二 = 1,…,周日 = 6
2周日0-6:周日 = 0,周一 = 1,…,周六 = 6
3周日1-7:周日 = 1,周一 = 2,…,周六 = 7

语法

toDayOfWeek(datetime[, mode[, timezone]])

别名: DAYOFWEEK

参数

  • datetime — 要获取星期几的日期或日期时间值。DateDate32DateTimeDateTime64
  • mode — 可选。指定星期模式的整数(0-3)。如果省略,默认为 0。UInt8
  • timezone — 可选。用于转换的时区。String

返回值

返回给定 DateDateTime 的星期几,类型为 UInt8

示例

用法示例

-- 以下日期为 2023 年 4 月 21 日,这是一个星期五:
SELECT
    toDayOfWeek(toDateTime('2023-04-21')),
    toDayOfWeek(toDateTime('2023-04-21'), 1)
┌─toDayOfWeek(toDateTime('2023-04-21'))─┬─toDayOfWeek(toDateTime('2023-04-21'), 1)─┐
│                                     5 │                                        4 │
└───────────────────────────────────────┴──────────────────────────────────────────┘

toDayOfYear

自 v18.4 引入

返回 DateDateTime 值在一年中的第几天(1-366)。

语法

toDayOfYear(datetime)

别名: DAYOFYEAR

参数

返回值

返回给定 Date 或 DateTime 值在一年中的第几天,返回类型为 UInt16

示例

使用示例

SELECT toDayOfYear(toDateTime('2023-04-21 10:20:30'))
┌─toDayOfYear(toDateTime('2023-04-21 10:20:30'))─┐
│                                            111 │
└────────────────────────────────────────────────┘

toDaysSinceYearZero

引入版本:v23.9

对于给定日期,返回自 0000 年 1 月 1 日 起经过的天数,基于 ISO 8601 定义的前推格里高利历(proleptic Gregorian calendar)

其计算方式与 MySQL 的 TO_DAYS 函数相同。

语法

toDaysSinceYearZero(date[, time_zone])

别名: TO_DAYS

参数

返回值

返回自日期 0000-01-01 起已经过去的天数。UInt32

示例

计算自公元 0 年起经过的天数

SELECT toDaysSinceYearZero(toDate('2023-09-08'))
┌─toDaysSinceYearZero(toDate('2023-09-08')))─┐
│                                     713569 │
└────────────────────────────────────────────┘

toHour

引入于:v1.1

返回 DateTimeDateTime64 值的小时部分(0-23)。

语法

toHour(datetime)

别名HOUR

参数

返回值

返回 datetime 的小时数(0-23)。UInt8

示例

使用示例

SELECT toHour(toDateTime('2023-04-21 10:20:30'))
┌─toHour(toDateTime('2023-04-21 10:20:30'))─┐
│                                        10 │
└───────────────────────────────────────────┘

toISOYear

自 v18.4 起引入

将日期或带时间的日期转换为 ISO 年序号。

语法

toISOYear(datetime)

参数

返回值

返回将输入值转换得到的 ISO 年份。UInt16

示例

从日期值中获取 ISO 年份

SELECT
toISOYear(toDate('2024/10/02')) as year1,
toISOYear(toDateTime('2024-10-02 01:30:00')) as year2
┌─week1─┬─week2─┐
│    40 │    40 │
└───────┴───────┘

toLastDayOfMonth

引入版本:v1.1

将日期或带时间的日期向上取整为该月的最后一天。

注意

可以通过设置 enable_extended_results_for_datetime_functions 来配置返回类型。

语法

toLastDayOfMonth(value)

别名: LAST_DAY

参数

返回值

返回给定日期或日期时间值所在月份的最后一天的日期。Date

示例

向上取整到所在月份的最后一天

SELECT toLastDayOfMonth(toDateTime('2023-04-21 10:20:30'))
┌─toLastDayOfMonth(toDateTime('2023-04-21 10:20:30'))─┐
│                                          2023-04-30 │
└─────────────────────────────────────────────────────┘

toLastDayOfWeek

引入版本:v23.5

将日期或带时间的日期向上取整到最近的星期六或星期日。

注意

可以通过设置 enable_extended_results_for_datetime_functions 来配置返回类型。

语法

toLastDayOfWeek(datetime[, mode[, timezone]])

参数

  • datetime — 要转换的日期或日期时间值。DateDateTimeDate32DateTime64
  • mode — 按照 toWeek() 函数中的说明确定一周的第一天。默认值为 0UInt8
  • timezone — 可选。用于转换的时区。如果未指定,则使用服务器时区。String

返回值

根据 mode 参数,返回给定日期当天或之后、距离最近的周六或周日的日期。DateDate32DateTimeDateTime64

示例

向上取整到最近的周六或周日

SELECT
    toLastDayOfWeek(toDateTime('2023-04-21 10:20:30')), /* 星期五 */
    toLastDayOfWeek(toDateTime('2023-04-21 10:20:30'), 1), /* 星期五 */
    toLastDayOfWeek(toDate('2023-04-23')), /* 星期日 */
    toLastDayOfWeek(toDate('2023-04-23'), 1) /* 星期日 */
FORMAT Vertical
Row 1:
──────
toLastDayOfWeek(toDateTime('2023-04-21 10:20:30')):      2023-04-23
toLastDayOfWeek(toDateTime('2023-04-21 10:20:30'), 1):   2023-04-22
toLastDayOfWeek(toDate('2023-04-23')):                   2023-04-23
toLastDayOfWeek(toDate('2023-04-23'), 1):                2023-04-23

toMillisecond

自 v24.2 起引入

返回 DateTimeDateTime64 值的毫秒部分(0-999)。

语法

toMillisecond(datetime)

别名: MILLISECOND

参数

返回值

返回 datetime 所在分钟中的毫秒数(0 - 59)。UInt16

示例

用法示例

SELECT toMillisecond(toDateTime64('2023-04-21 10:20:30.456', 3));
┌──toMillisecond(toDateTime64('2023-04-21 10:20:30.456', 3))─┐
│                                                        456 │
└────────────────────────────────────────────────────────────┘

toMinute

引入于:v1.1

返回 DateDateTime 值的分钟部分(0-59)。

语法

toMinute(datetime)

别名MINUTE

参数

返回值

返回 datetime 所在小时中的分钟数(0 - 59)。UInt8

示例

使用示例

SELECT toMinute(toDateTime('2023-04-21 10:20:30'))
┌─toMinute(toDateTime('2023-04-21 10:20:30'))─┐
│                                          20 │
└─────────────────────────────────────────────┘

toModifiedJulianDay

引入于:v21.1

将文本形式为 YYYY-MM-DD前推格里高利历日期转换为 Int32 类型的修正儒略日数值。该函数支持的日期范围为 0000-01-019999-12-31。如果参数无法解析为日期或日期无效,则会抛出异常。

语法

toModifiedJulianDay(date)

参数

返回值

返回修正儒略日数。Int32

示例

将日期转换为修正儒略日数

SELECT toModifiedJulianDay('2020-01-01')
┌─toModifiedJulianDay('2020-01-01')─┐
│                             58849 │
└───────────────────────────────────┘

toModifiedJulianDayOrNull

自 v21.1 起引入

类似于 toModifiedJulianDay(),但不会抛出异常,而是返回 NULL

语法

toModifiedJulianDayOrNull(date)

参数

返回值

对于有效的 date,返回修正儒略日编号,否则返回 nullNullable(Int32)

示例

将日期转换为修正儒略日并处理 null 值

SELECT toModifiedJulianDayOrNull('2020-01-01');
SELECT toModifiedJulianDayOrNull('0000-00-00'); -- 无效日期,返回 NULL
┌─toModifiedJu⋯020-01-01')─┐
│                    58849 │
└──────────────────────────┘
┌─toModifiedJu⋯000-00-00')─┐
│                     ᴺᵁᴸᴸ │
└──────────────────────────┘

toMonday

自 v1.1 起引入

将日期或带时间的日期向下取整到同一周的星期一。返回对应日期。

注意

可以通过设置 enable_extended_results_for_datetime_functions 来配置返回类型。

语法

toMonday(value)

参数

返回值

返回给定日期或带时间的日期所在周周一的日期。Date

示例

向下取整到所在周的周一

SELECT
toMonday(toDateTime('2023-04-21 10:20:30')), -- 星期五
toMonday(toDate('2023-04-24'));              -- 已经是星期一
┌─toMonday(toDateTime('2023-04-21 10:20:30'))─┬─toMonday(toDate('2023-04-24'))─┐
│                                  2023-04-17 │                     2023-04-24 │
└─────────────────────────────────────────────┴────────────────────────────────┘

toMonth

引入于:v1.1

返回 DateDateTime 值的月份部分(1-12)。

语法

toMonth(datetime)

别名MONTH

参数

返回值

返回给定日期/时间的月份,类型为 UInt8

示例

使用示例

SELECT toMonth(toDateTime('2023-04-21 10:20:30'))
┌─toMonth(toDateTime('2023-04-21 10:20:30'))─┐
│                                          4 │
└────────────────────────────────────────────┘

toMonthNumSinceEpoch

引入版本:v25.3

返回自 1970 年起经过的月份数

语法

toMonthNumSinceEpoch(date)

参数

返回值

正整数

示例

示例

SELECT toMonthNumSinceEpoch(toDate('2024-10-01'))
657

toQuarter

引入版本:v1.1

对于给定的 DateDateTime 值,返回其所在年的季度(1-4)。

语法

toQuarter(datetime)

别名: QUARTER

参数

返回值

返回给定日期/时间所属的季度,类型为 UInt8

示例

用法示例

SELECT toQuarter(toDateTime('2023-04-21 10:20:30'))
┌─toQuarter(toDateTime('2023-04-21 10:20:30'))─┐
│                                            2 │
└──────────────────────────────────────────────┘

toRelativeDayNum

引入于:v1.1

将日期或日期时间转换为自过去某个固定时间点以来经过的天数。 这一具体时间点属于实现细节,因此不建议单独使用此函数。 该函数的主要用途是计算两个日期或日期时间之间的天数差,例如:toRelativeDayNum(dt1) - toRelativeDayNum(dt2)

语法

toRelativeDayNum(date)

参数

返回值

返回自某个固定参考起点以来经过的天数。UInt32

示例

获取相对天数编号

SELECT toRelativeDayNum(toDate('2023-04-01')) - toRelativeDayNum(toDate('2023-01-01'))
┌─minus(toRela⋯3-01-01')))─┐
│                       90 │
└──────────────────────────┘

toRelativeHourNum

引入版本:v1.1

将日期或日期时间转换为自过去某个固定时间点以来经过的小时数。 该具体时间点属于实现细节,因此不建议单独使用此函数。 此函数的主要用途是计算两个日期或日期时间之间的小时差,例如:toRelativeHourNum(dt1) - toRelativeHourNum(dt2)

语法

toRelativeHourNum(date)

参数

返回值

返回自过去某一固定参考点起算的小时数。UInt32

示例

获取相对小时数

SELECT toRelativeHourNum(toDateTime('2023-01-01 12:00:00')) - toRelativeHourNum(toDateTime('2023-01-01 00:00:00')) AS hours_difference
┌─hours_difference─┐
│               12 │
└──────────────────┘

toRelativeMinuteNum

引入于:v1.1

将日期或带时间的日期转换为自某个固定的过去时间点以来经过的分钟数。 该具体时间点属于实现细节,因此此函数并不打算作为独立函数单独使用。 该函数的主要用途是计算两个日期或带时间的日期之间相差的分钟数,例如:toRelativeMinuteNum(dt1) - toRelativeMinuteNum(dt2)

语法

toRelativeMinuteNum(date)

参数

返回值

返回自过去某个固定参考点以来的分钟数。UInt32

示例

获取相对分钟数

SELECT toRelativeMinuteNum(toDateTime('2023-01-01 00:30:00')) - toRelativeMinuteNum(toDateTime('2023-01-01 00:00:00')) AS minutes_difference
┌─minutes_difference─┐
│                 30 │
└────────────────────┘

toRelativeMonthNum

自 v1.1 版本引入

将日期或带时间的日期转换为自过去某个固定时间点以来经过的月份数。 这个具体时间点属于实现细节,因此不建议单独使用此函数。 该函数的主要用途是计算两个日期或带时间的日期之间相差的月份数,例如:toRelativeMonthNum(dt1) - toRelativeMonthNum(dt2)

语法

toRelativeMonthNum(date)

参数

返回值

返回从过去某个固定参考点起算的月数。UInt32

示例

获取相对月份数

SELECT toRelativeMonthNum(toDate('2023-04-01')) - toRelativeMonthNum(toDate('2023-01-01')) AS months_difference
┌─months_difference─┐
│                 3 │
└───────────────────┘

toRelativeQuarterNum

引入于:v1.1

将日期或带时间的日期转换为自过去某个固定时间点以来经过的季度数。 该时间点的具体取值属于实现细节,因此不建议单独使用此函数。 该函数的主要用途是计算两个日期或带时间的日期之间相差的季度数,例如:toRelativeQuarterNum(dt1) - toRelativeQuarterNum(dt2)

语法

toRelativeQuarterNum(date)

参数

返回值

返回自过去某个固定参考点起算的季度数。UInt32

示例

获取相对季度序号

SELECT toRelativeQuarterNum(toDate('2023-04-01')) - toRelativeQuarterNum(toDate('2023-01-01')) AS quarters_difference
┌─quarters_difference─┐
│                   1 │
└─────────────────────┘

toRelativeSecondNum

引入版本:v1.1

将日期或日期时间转换为自某个固定过去时刻起已过去的秒数。 该精确时间点属于实现细节,因此不建议单独使用此函数。 该函数的主要用途是计算两个日期或日期时间之间的秒数差,例如:toRelativeSecondNum(dt1) - toRelativeSecondNum(dt2)

语法

toRelativeSecondNum(date)

参数

返回值

返回自过去某个固定参考点起算的秒数。UInt32

示例

获取相对秒数

SELECT toRelativeSecondNum(toDateTime('2023-01-01 00:01:00')) - toRelativeSecondNum(toDateTime('2023-01-01 00:00:00')) AS seconds_difference
┌─seconds_difference─┐
│                 60 │
└────────────────────┘

toRelativeWeekNum

自 v1.1 版本引入

将日期或带时间的日期转换为自某个固定过去时间点以来经过的周数。 该具体时间点属于实现细节,因此不建议将此函数单独使用。 此函数的主要用途是计算两个日期或日期时间值之间相差的周数,例如:toRelativeWeekNum(dt1) - toRelativeWeekNum(dt2)

语法

toRelativeWeekNum(date)

参数

返回值

返回自过去某个固定参考点起算的周数。UInt32

示例

获取相对周数

SELECT toRelativeWeekNum(toDate('2023-01-08')) - toRelativeWeekNum(toDate('2023-01-01')) AS weeks_difference
┌─weeks_difference─┐
│                1 │
└──────────────────┘

toRelativeYearNum

自 v1.1 起引入

将日期或带时间的日期转换为自过去某个固定时间点以来经过的年数。 这个具体时间点属于实现细节,因此不建议单独使用此函数。 此函数的主要用途是计算两个日期或带时间的日期之间相差的年数,例如:toRelativeYearNum(dt1) - toRelativeYearNum(dt2)

语法

toRelativeYearNum(date)

参数

返回值

返回从过去某个固定参考点开始计算的年份数。UInt16

示例

获取相对年份值

SELECT toRelativeYearNum('2010-10-01'::DateTime) - toRelativeYearNum('2000-01-01'::DateTime)
┌─minus(toRela⋯ateTime')))─┐
│                       10 │
└──────────────────────────┘

toSecond

自 v1.1 引入

返回 DateTimeDateTime64 值的秒部分(0-59)。

语法

toSecond(datetime)

别名: SECOND

参数

返回值

返回 datetime 中所在分钟内的秒数 (0 - 59)。UInt8

示例

用法示例

SELECT toSecond(toDateTime('2023-04-21 10:20:30'))
┌─toSecond(toDateTime('2023-04-21 10:20:30'))─┐
│                                          30 │
└─────────────────────────────────────────────┘

toStartOfDay

自 v1.1 引入

将日期时间向下取整到当天的起始时刻。

注意

可以通过设置 enable_extended_results_for_datetime_functions 来配置返回类型。

语法

toStartOfDay(datetime)

参数

  • datetime — 要进行取整的日期或日期时间。DateDateTime

返回值

返回向下取整到一天起始时刻的日期时间值。DateDateTimeDate32DateTime64

示例

向下取整到一天起始时刻

SELECT toStartOfDay(toDateTime('2023-04-21 10:20:30'))
┌─toStartOfDay(toDateTime('2023-04-21 10:20:30'))─┐
│                             2023-04-21 00:00:00 │
└─────────────────────────────────────────────────┘

toStartOfFifteenMinutes

自 v1.1 起引入

将带时间的日期向下取整到所在十五分钟区间的起始时刻。

注意

可以通过设置 enable_extended_results_for_datetime_functions 来配置返回类型。

语法

toStartOfFifteenMinutes(datetime)

参数

返回值

返回向最近的 15 分钟区间起始时刻取整后的日期时间。类型为 DateTimeDateTime64

示例

示例

SELECT
    toStartOfFifteenMinutes(toDateTime('2023-04-21 10:17:00')),
    toStartOfFifteenMinutes(toDateTime('2023-04-21 10:20:00')),
    toStartOfFifteenMinutes(toDateTime('2023-04-21 10:23:00'))
FORMAT Vertical
Row 1:
──────
toStartOfFifteenMinutes(toDateTime('2023-04-21 10:17:00')): 2023-04-21 10:15:00
toStartOfFifteenMinutes(toDateTime('2023-04-21 10:20:00')): 2023-04-21 10:15:00
toStartOfFifteenMinutes(toDateTime('2023-04-21 10:23:00')): 2023-04-21 10:15:00

toStartOfFiveMinutes

引入于:v22.6

将包含时间的日期向下舍入到最近的 5 分钟区间的起始时间。

注意

可以通过设置 enable_extended_results_for_datetime_functions 来配置返回类型。

语法

toStartOfFiveMinutes(datetime)

别名: toStartOfFiveMinute

参数

返回值

返回将日期时间取整到最近五分钟区间起始时刻的值,类型为 DateTimeDateTime64

示例

示例

SELECT
    toStartOfFiveMinutes(toDateTime('2023-04-21 10:17:00')),
    toStartOfFiveMinutes(toDateTime('2023-04-21 10:20:00')),
    toStartOfFiveMinutes(toDateTime('2023-04-21 10:23:00'))
FORMAT Vertical
Row 1:
──────
toStartOfFiveMinutes(toDateTime('2023-04-21 10:17:00')): 2023-04-21 10:15:00
toStartOfFiveMinutes(toDateTime('2023-04-21 10:20:00')): 2023-04-21 10:20:00
toStartOfFiveMinutes(toDateTime('2023-04-21 10:23:00')): 2023-04-21 10:20:00

toStartOfHour

自 v1.1 起引入

将带时间的日期向下取整到所在小时的起始时刻(整点)。

注意

可以通过设置 enable_extended_results_for_datetime_functions 来配置返回类型。

语法

toStartOfHour(datetime)

参数

返回值

返回向下取整到整点起始时间的日期时间值。DateTimeDateTime64

示例

向下取整到整点

SELECT
    toStartOfHour(toDateTime('2023-04-21 10:20:30'));
┌─────────────────res─┬─toTypeName(res)─┐
│ 2023-04-21 10:00:00 │ DateTime        │
└─────────────────────┴─────────────────┘

toStartOfISOYear

引入版本:v1.1

将日期或日期时间向下取整到该 ISO 年的第一天,这可能与公历年份不同。参见 ISO 周日期

注意

可以通过设置 enable_extended_results_for_datetime_functions 来配置返回类型。

语法

toStartOfISOYear(value)

参数

返回值

返回给定日期或日期时间值所在 ISO 年的第一天。Date

示例

向下取整到 ISO 年的第一天

SELECT toStartOfISOYear(toDateTime('2023-04-21 10:20:30'))
┌─toStartOfISOYear(toDateTime('2023-04-21 10:20:30'))─┐
│                                          2023-01-02 │
└─────────────────────────────────────────────────────┘

toStartOfInterval

引入于:v20.1

此函数使用 toStartOfInterval(date_or_date_with_time, 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) 相同。

计算是相对于特定时间点进行的:

IntervalStart
YEARyear 0
QUARTER1900 Q1
MONTH1900 January
WEEK1970, 1st week (01-05)
DAY1970-01-01
HOUR(*)
MINUTE1970-01-01 00:00:00
SECOND1970-01-01 00:00:00
MILLISECOND1970-01-01 00:00:00
MICROSECOND1970-01-01 00:00:00
NANOSECOND1970-01-01 00:00:00
(*) 小时间隔是特殊的:计算始终是相对于当日 00:00:00(午夜)进行的。

如果指定了 WEEK 单位,toStartOfInterval 认为一周从周一开始。注意,这一行为不同于 toStartOfWeek 函数,其默认是一周从周日开始。

第二个重载分别模拟了 TimescaleDB 的 time_bucket() 函数以及 PostgreSQL 的 date_bin() 函数。

语法

toStartOfInterval(value, INTERVAL x unit[, time_zone])
toStartOfInterval(value, INTERVAL x unit[, origin[, time_zone]])

别名: date_bin, time_bucket

参数

  • value — 要向下取整的日期或日期时间值。DateDateTimeDateTime64
  • x — 时间间隔长度的数值。- unit — 时间间隔单位:YEAR、QUARTER、MONTH、WEEK、DAY、HOUR、MINUTE、SECOND、MILLISECOND、MICROSECOND、NANOSECOND。- time_zone — 可选。表示时区名称的字符串。- origin — 可选。用于计算的起点(仅适用于第二种重载)。

返回值

返回包含输入值的时间间隔的起始时间。DateTime

示例

基本时间间隔舍入

SELECT toStartOfInterval(toDateTime('2023-01-15 14:30:00'), INTERVAL 1 MONTH)
┌─toStartOfInt⋯alMonth(1))─┐
│               2023-01-01 │
└──────────────────────────┘

使用原点

SELECT toStartOfInterval(toDateTime('2023-01-01 14:45:00'), INTERVAL 1 MINUTE, toDateTime('2023-01-01 14:35:30'))
┌─toStartOfInt⋯14:35:30'))─┐
│      2023-01-01 14:44:30 │
└──────────────────────────┘

toStartOfMicrosecond

引入版本:v22.6

将日期时间向下舍入(截断)到该微秒的起始时刻。

语法

toStartOfMicrosecond(datetime[, timezone])

参数

  • datetime — 日期和时间。DateTime64
  • timezone — 可选。返回值所使用的时区。如果未指定,则函数使用 value 参数的时区。String

返回值

保留亚微秒的输入值 DateTime64

示例

不带时区的查询

WITH toDateTime64('2020-01-01 10:20:30.999999999', 9) AS dt64
SELECT toStartOfMicrosecond(dt64);
┌────toStartOfMicrosecond(dt64)─┐
│ 2020-01-01 10:20:30.999999000 │
└───────────────────────────────┘

带时区的查询

WITH toDateTime64('2020-01-01 10:20:30.999999999', 9) AS dt64
SELECT toStartOfMicrosecond(dt64, 'Asia/Istanbul');
┌─toStartOfMicrosecond(dt64, 'Asia/Istanbul')─┐
│               2020-01-01 12:20:30.999999000 │
└─────────────────────────────────────────────┘

toStartOfMillisecond

引入版本:v22.6

将日期时间向下取整到该毫秒的起始时刻。

语法

toStartOfMillisecond(datetime[, timezone])

参数

  • datetime — 日期和时间。DateTime64
  • timezone — 可选。返回值所使用的时区。如果未指定,函数会使用 value 参数的时区。String

返回值

包含子毫秒部分的输入值。DateTime64

示例

不带时区的查询

WITH toDateTime64('2020-01-01 10:20:30.999999999', 9) AS dt64
SELECT toStartOfMillisecond(dt64);
┌────toStartOfMillisecond(dt64)─┐
│ 2020-01-01 10:20:30.999000000 │
└───────────────────────────────┘

按时区查询

WITH toDateTime64('2020-01-01 10:20:30.999999999', 9) AS dt64
SELECT toStartOfMillisecond(dt64, 'Asia/Istanbul');
┌─toStartOfMillisecond(dt64, 'Asia/Istanbul')─┐
│               2020-01-01 12:20:30.999000000 │
└─────────────────────────────────────────────┘

toStartOfMinute

引入于:v1.1

将带时间的日期向下取整到所属分钟的起始时刻。

注意

可以通过设置 enable_extended_results_for_datetime_functions 来配置返回类型。

语法

toStartOfMinute(datetime)

参数

返回值

返回向下取整到该分钟起始时刻的日期时间。DateTimeDateTime64

示例

向下取整到该分钟的起始时刻

SELECT
    toStartOfMinute(toDateTime('2023-04-21 10:20:30')),
    toStartOfMinute(toDateTime64('2023-04-21 10:20:30.5300', 8))
FORMAT Vertical
第 1 行:
──────
toStartOfMinute(toDateTime('2023-04-21 10:20:30')):           2023-04-21 10:20:00
toStartOfMinute(toDateTime64('2023-04-21 10:20:30.5300', 8)): 2023-04-21 10:20:00

toStartOfMonth

自 v1.1 起引入

将日期或日期时间向下取整到所在月份的第一天。

注意

可以通过设置 enable_extended_results_for_datetime_functions 来配置返回类型。

语法

toStartOfMonth(value)

参数

返回值

返回给定日期或带时间的日期所在月份的第一天。Date

示例

向下舍入到所在月份的第一天

SELECT toStartOfMonth(toDateTime('2023-04-21 10:20:30'))
┌─toStartOfMonth(toDateTime('2023-04-21 10:20:30'))─┐
│                                        2023-04-01 │
└───────────────────────────────────────────────────┘

toStartOfNanosecond

引入版本:v22.6

将带时间的日期向下取整到纳秒。

语法

toStartOfNanosecond(datetime[, timezone])

参数

  • datetime — 日期和时间。DateTime64
  • timezone — 可选。返回值使用的时区。如果未指定,函数会使用 value 参数的时区。String

返回值

带纳秒精度的输入值。DateTime64

示例

不带时区的查询

WITH toDateTime64('2020-01-01 10:20:30.999999999', 9) AS dt64
SELECT toStartOfNanosecond(dt64);
┌─────toStartOfNanosecond(dt64)─┐
│ 2020-01-01 10:20:30.999999999 │
└───────────────────────────────┘

按时区查询

WITH toDateTime64('2020-01-01 10:20:30.999999999', 9) AS dt64
SELECT toStartOfNanosecond(dt64, 'Asia/Istanbul');
┌─toStartOfNanosecond(dt64, 'Asia/Istanbul')─┐
│              2020-01-01 12:20:30.999999999 │
└────────────────────────────────────────────┘

toStartOfQuarter

引入版本:v1.1

将日期或带时间的日期向下取整到该季度的第一天。季度的第一天分别为 1 月 1 日、4 月 1 日、7 月 1 日或 10 月 1 日。

注意

可以通过设置 enable_extended_results_for_datetime_functions 来配置返回类型。

语法

toStartOfQuarter(value)

参数

返回值

返回给定日期或日期时间值所在季度的第一天。Date

示例

向下取整到所在季度的第一天

SELECT toStartOfQuarter(toDateTime('2023-04-21 10:20:30'))
┌─toStartOfQuarter(toDateTime('2023-04-21 10:20:30'))─┐
│                                          2023-04-01 │
└─────────────────────────────────────────────────────┘

toStartOfSecond

自 v20.5 版本引入

将日期时间值向下取整到所在秒的起始时刻。

语法

toStartOfSecond(datetime[, timezone])

参数

  • datetime — 要截断小数秒部分的日期时间值。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, 'Asia/Istanbul');
┌─toStartOfSecond(dt64, 'Asia/Istanbul')─┐
│                2020-01-01 13:20:30.000 │
└────────────────────────────────────────┘

toStartOfTenMinutes

引入版本:v20.1

将带时间的日期向下取整到最近 10 分钟区间的起始时间点。

注意

可以通过设置 enable_extended_results_for_datetime_functions 来配置返回类型。

语法

toStartOfTenMinutes(datetime)

参数

返回值

返回将时间舍入到最近 10 分钟区间起始时刻的日期时间值,类型为 DateTimeDateTime64

示例

示例

SELECT
    toStartOfTenMinutes(toDateTime('2023-04-21 10:17:00')),
    toStartOfTenMinutes(toDateTime('2023-04-21 10:20:00')),
    toStartOfTenMinutes(toDateTime('2023-04-21 10:23:00'))
FORMAT Vertical
Row 1:
──────
toStartOfTenMinutes(toDateTime('2023-04-21 10:17:00')): 2023-04-21 10:10:00
toStartOfTenMinutes(toDateTime('2023-04-21 10:20:00')): 2023-04-21 10:20:00
toStartOfTenMinutes(toDateTime('2023-04-21 10:23:00')): 2023-04-21 10:20:00

toStartOfWeek

自 v20.1 引入

将日期或日期时间向下取整到最近的星期日或星期一的起始时刻。

注意

可以通过设置 enable_extended_results_for_datetime_functions 来配置返回类型。

语法

toStartOfWeek(datetime[, mode[, timezone]])

参数

  • datetime — 要转换的日期或日期时间值。DateDateTimeDate32DateTime64
  • mode — 按照 toWeek() 函数中的说明确定一周的第一天。默认值为 0UInt8
  • timezone — 用于转换的时区。如果未指定,则使用服务器的时区。String

返回值

返回给定日期当日或之前、最接近的周日或周一的日期,具体取决于 mode 参数。返回类型为 DateDate32DateTimeDateTime64

示例

向下取整到最近的周日或周一

SELECT
        toStartOfWeek(toDateTime('2023-04-21 10:20:30')), /* 星期五 */
        toStartOfWeek(toDateTime('2023-04-21 10:20:30'), 1), /* 星期五 */
        toStartOfWeek(toDate('2023-04-24')), /* 星期一 */
        toStartOfWeek(toDate('2023-04-24'), 1) /* 星期一 */
    FORMAT Vertical
Row 1:
    ──────
    toStartOfWeek(toDateTime('2023-04-21 10:20:30')):      2023-04-17
    toStartOfWeek(toDateTime('2023-04-21 10:20:30'), 1):   2023-04-17
    toStartOfWeek(toDate('2023-04-24')):                   2023-04-24
    toStartOfWeek(toDate('2023-04-24'), 1):                2023-04-24

toStartOfYear

自 v1.1 起提供

将日期或带时间的日期向下取整到该年的第一天。返回值为 Date 对象。

注意

可以通过设置 enable_extended_results_for_datetime_functions 来配置返回类型。

语法

toStartOfYear(value)

参数

返回值

返回给定日期/时间所在年份的第一天,类型为 Date

示例

向下取整到所在年份的第一天

SELECT toStartOfYear(toDateTime('2023-04-21 10:20:30'))
┌─toStartOfYear(toDateTime('2023-04-21 10:20:30'))─┐
│                                       2023-01-01 │
└──────────────────────────────────────────────────┘

toTimeWithFixedDate

引入版本:v1.1

提取日期或日期时间值中的时间部分。 返回结果表示到某个固定时间点的偏移量,目前为 1970-01-02, 但该时间点的具体取值属于实现细节,将来可能会发生变化。

因此,不应单独使用 toTime。 该函数的主要用途是计算两个日期或日期时间之间的时间差,例如:toTime(dt1) - toTime(dt2)

语法

toTime(date[, timezone])

参数

返回值

返回日期或带时间的日期的时间部分,以相对于一个固定时间点(当前选定为 1970-01-02)的偏移量形式表示。DateTime

示例

计算两个日期之间的时间差

SELECT toTime('2025-06-15 12:00:00'::DateTime) - toTime('2024-05-10 11:00:00'::DateTime) AS result, toTypeName(result)
┌─result─┬─toTypeName(result)─┐
│   3600 │ Int32              │
└────────┴────────────────────┘

toTimezone

引入于:v1.1

DateTimeDateTime64 转换为指定的时区。 数据的内部值(Unix 时间戳秒数)不会改变。 只有该值的时区属性和字符串表示会发生改变。

语法

toTimeZone(datetime, timezone)

别名: toTimeZone

参数

返回值

返回一个与输入时间戳相同,但使用指定时区的值,类型为 DateTimeDateTime64

示例

用法示例

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;
第 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

toUTCTimestamp

引入版本:v23.8

将某一时区的 date 或带时间的日期值转换为 UTC 时区对应的时间戳。此函数主要用于与 Apache Spark 及类似框架的兼容性。

语法

toUTCTimestamp(datetime, time_zone)

别名: to_utc_timestamp

参数

  • datetimeDate 或带时间的类型的常量值或表达式。DateTimeDateTime64
  • time_zone — 表示时区的 String 类型常量值或表达式。String

返回值

返回处于 UTC 时区的日期或日期时间值。DateTimeDateTime64

示例

将时区转换为 UTC 时间

SELECT toUTCTimestamp(toDateTime('2023-03-16'), 'Asia/Shanghai')
┌─toUTCTimestamp(toDateTime('2023-03-16'), 'Asia/Shanghai')─┐
│                                     2023-03-15 16:00:00 │
└─────────────────────────────────────────────────────────┘

toUnixTimestamp

引入版本:v1.1

StringDateDateTime 转换为 Unix 时间戳(自 1970-01-01 00:00:00 UTC 以来的秒数),类型为 UInt32

语法

toUnixTimestamp(date[, timezone])

参数

返回值

返回 Unix 时间戳。UInt32

示例

使用示例

SELECT
'2017-11-05 08:07:47' AS dt_str,
toUnixTimestamp(dt_str) AS from_str,
toUnixTimestamp(dt_str, 'Asia/Tokyo') AS from_str_tokyo,
toUnixTimestamp(toDateTime(dt_str)) AS from_datetime,
toUnixTimestamp(toDateTime64(dt_str, 0)) AS from_datetime64,
toUnixTimestamp(toDate(dt_str)) AS from_date,
toUnixTimestamp(toDate32(dt_str)) AS from_date32
FORMAT Vertical;
Row 1:
──────
dt_str:          2017-11-05 08:07:47
from_str:        1509869267
from_str_tokyo:  1509836867
from_datetime:   1509869267
from_datetime64: 1509869267
from_date:       1509840000
from_date32:     1509840000

toWeek

引入于:v20.1

此函数返回 datedatetime 的周序号。toWeek() 的双参数形式允许你指定一周从星期日还是星期一开始,以及返回值是在 053 范围内还是在 153 范围内。

toISOWeek() 是一个兼容性函数,等价于 toWeek(date,3)

下表说明了 mode 参数的工作方式。

ModeFirst day of weekRangeWeek 1 is the first week ...
0Sunday0-53with a Sunday in this year
1Monday0-53with 4 or more days this year
2Sunday1-53with a Sunday in this year
3Monday1-53with 4 or more days this year
4Sunday0-53with 4 or more days this year
5Monday0-53with a Monday in this year
6Sunday1-53with 4 or more days this year
7Monday1-53with a Monday in this year
8Sunday1-53contains January 1
9Monday1-53contains January 1

对于含义为“在本年度中包含 4 天或以上”的 mode 取值,周序号按照 ISO 8601:1988 编号:

  • 如果包含 1 月 1 日的那一周,在新的一年中有 4 天或以上,则它是第 1 周。
  • 否则,它是上一年的最后一周,而下一周才是第 1 周。

对于含义为“包含 1 月 1 日”的 mode 取值,包含 1 月 1 日的那一周即为第 1 周。 该周在新的一年中包含多少天并不重要,即使只包含 1 天也一样。 也就是说,如果 12 月的最后一周包含下一年的 1 月 1 日,那么它将是下一年的第 1 周。

第一个参数也可以以 String 的形式指定,格式须为 parseDateTime64BestEffort() 所支持的格式。对字符串参数的支持仅是为了与某些第三方工具所期望的 MySQL 保持兼容。由于将来字符串参数的支持可能会依赖新的 MySQL 兼容性设置,并且字符串解析通常较慢,因此不建议使用它。

语法

toWeek(datetime[, mode[, time_zone]])

别名: week

参数

  • datetime — 要获取周数的日期或日期时间值。DateDateTime
  • mode — 可选。09 的模式,用于确定每周的第一天以及周数的取值范围。默认值为 0
  • time_zone — 可选。时区。String

返回值

根据指定模式返回周数。UInt32

示例

使用不同模式获取周数

SELECT toDate('2016-12-27') AS date, toWeek(date) AS week0, toWeek(date,1) AS week1, toWeek(date,9) AS week9
┌───────date─┬─week0─┬─week1─┬─week9─┐
│ 2016-12-27 │    52 │    52 │     1 │
└────────────┴───────┴───────┴───────┘

toYYYYMM

引入版本:v1.1

将日期或带时间的日期转换为一个 UInt32 数值,表示年份和月份(YYYY * 100 + MM)。 接受第二个可选的时区参数。如果提供,该时区必须是字符串常量。

此函数与函数 YYYYMMDDToDate() 互为逆函数。

语法

toYYYYMM(datetime[, timezone])

参数

  • datetime — 要转换的日期或带时间的日期类型。DateDate32DateTimeDateTime64
  • timezone — 可选。用于转换的时区。如果提供,则该时区必须是字符串常量。String

返回值

返回一个 UInt32 值,表示年份和月份(YYYY * 100 + MM)。UInt32

示例

将当前日期转换为 YYYYMM 格式

SELECT toYYYYMM(now(), 'US/Eastern')
┌─toYYYYMM(now(), 'US/Eastern')─┐
│                        202303 │
└───────────────────────────────┘

toYYYYMMDD

引入版本:v1.1

将日期或带时间的日期转换为一个 UInt32 数值,其中包含年份、月份和日期数字(YYYY * 10000 + MM * 100 + DD)。接受第二个可选的时区参数。如果提供,该时区必须是字符串常量。

语法

toYYYYMMDD(datetime[, timezone])

参数

  • datetime — 要转换的日期或日期时间值。可以是 DateDate32DateTimeDateTime64 类型。
  • timezone — 可选。用于转换的时区。如果提供该参数,则时区必须是字符串常量,对应 String 类型。

返回值

返回一个 UInt32 整数,包含年、月和日,编码格式为 YYYY * 10000 + MM * 100 + DDUInt32

示例

将当前日期转换为 YYYYMMDD 格式

SELECT toYYYYMMDD(now(), 'US/Eastern')
┌─toYYYYMMDD(now(), 'US/Eastern')─┐
│                        20230302 │
└─────────────────────────────────┘

toYYYYMMDDhhmmss

引入版本:v1.1

将日期或带时间的日期转换为 UInt64 数值,格式为 YYYYMMDDhhmmss(YYYY * 10000000000 + MM * 100000000 + DD * 1000000 + hh * 10000 + mm * 100 + ss)。 接受第二个可选的时区参数。如果提供,该时区必须为字符串常量。

语法

toYYYYMMDDhhmmss(datetime[, timezone])

参数

  • datetime — 要转换的日期或日期时间值。DateDate32DateTimeDateTime64
  • timezone — 可选。用于转换的时区。如果指定,时区必须是字符串常量。String

返回值

返回一个 UInt64 整数,包含年、月、日、时、分和秒(YYYY * 10000000000 + MM * 100000000 + DD * 1000000 + hh * 10000 + mm * 100 + ss)。UInt64

示例

将当前日期和时间转换为 YYYYMMDDhhmmss 格式

SELECT toYYYYMMDDhhmmss(now(), 'US/Eastern')
┌─toYYYYMMDDhhmmss(now(), 'US/Eastern')─┐
│                        20230302112209 │
└───────────────────────────────────────┘

toYear

引入版本:v1.1

返回 DateDateTime 值中的年份部分(公元年)。

语法

toYear(datetime)

别名: YEAR

参数

返回值

返回给定 Date 或 DateTime 的年份,返回类型为 UInt16

示例

使用示例

SELECT toYear(toDateTime('2023-04-21 10:20:30'))
┌─toYear(toDateTime('2023-04-21 10:20:30'))─┐
│                                     2023  │
└───────────────────────────────────────────┘

toYearNumSinceEpoch

引入于:v25.3

返回自 1970 年起经过的年份数

语法

toYearNumSinceEpoch(date)

参数

返回值

正整数

示例

示例

SELECT toYearNumSinceEpoch(toDate('2024-10-01'))
54

toYearWeek

引入版本:v20.1

返回指定日期对应的年份和周数。对于一年中的第一周和最后一周,结果中的年份可能与该日期所在的年份不同。

mode 参数的行为与 toWeek()mode 参数相同。

警告:toYearWeek() 返回的周数可能与 toWeek() 返回的不同。toWeek() 始终在给定年份的上下文中返回周数,如果 toWeek() 返回 0,则 toYearWeek() 会返回上一年最后一周对应的值。参见下面示例中的 prev_yearWeek

第一个参数也可以以 String 形式指定,其格式需为 parseDateTime64BestEffort() 所支持的格式。对字符串参数的支持仅出于与 MySQL 的兼容性考虑,因为某些第三方工具依赖于此。由于将来字符串参数支持可能会依赖新的 MySQL 兼容性设置,并且字符串解析通常较慢,建议不要使用字符串参数。

语法

toYearWeek(datetime[, mode[, timezone]])

别名yearweek

参数

  • datetime — 要获取其年份和周数的日期或日期时间值。DateDateTime
  • mode — 可选。取值 09,用于决定一周的第一天以及周序号的范围。默认值为 0
  • timezone — 可选。时区。String

返回值

返回由年份和周序号组合而成的整数值。UInt32

示例

在不同 mode 下获取年-周组合

SELECT toDate('2016-12-27') AS date, toYearWeek(date) AS yearWeek0, toYearWeek(date,1) AS yearWeek1, toYearWeek(date,9) AS yearWeek9, toYearWeek(toDate('2022-01-01')) AS prev_yearWeek
┌───────date─┬─yearWeek0─┬─yearWeek1─┬─yearWeek9─┬─prev_yearWeek─┐
│ 2016-12-27 │    201652 │    201652 │    201701 │        202152 │
└────────────┴───────────┴───────────┴───────────┴───────────────┘

today

首次引入于:v1.1

在查询分析阶段返回当前日期。等同于 toDate(now())

语法

today()

别名: curdate, current_date

参数

  • 无。

返回值

返回当前日期,类型为 Date

示例

使用示例

SELECT today() AS today, curdate() AS curdate, current_date() AS current_date FORMAT Pretty
┏━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━━━━━┓
┃      today ┃    curdate ┃ current_date ┃
┡━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━━━━━┩
│ 2025-03-03 │ 2025-03-03 │   2025-03-03 │
└────────────┴────────────┴──────────────┘

yesterday

引入于:v1.1

不接受任何参数,并在查询分析期间的某个时间点返回昨天的日期。

语法

yesterday()

参数

  • 无。

返回值

返回昨天的日期。Date

示例

获取昨天的日期

SELECT yesterday();
SELECT today() - 1;
┌─yesterday()─┐
│  2025-06-09 │
└─────────────┘
┌─minus(today(), 1)─┐
│        2025-06-09 │
└───────────────────┘