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

处理日期和时间的函数

本节中的大多数函数接受一个可选的时区参数,例如 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()

参数

  • 无。 返回值

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

示例

获取当前 UTC 时间戳

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

YYYYMMDDToDate

引入于:v23.9

将包含年份、月份和日期的数字转换为一个 Date。 此函数是函数 toYYYYMMDD() 的反向操作。 如果输入不编码有效的日期值,则输出未定义。

语法

YYYYMMDDToDate(YYYYMMDD)

参数

返回值

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

示例

示例

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

YYYYMMDDToDate32

引入于:v23.9

将包含年份、月份和日期的数字转换为一个 Date32。 此函数是函数 toYYYYMMDD() 的反向操作。 如果输入不编码有效的 Date32 值,则输出未定义。

语法

YYYYMMDDToDate32(YYYYMMDD)

参数

返回值

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

示例

示例

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

YYYYMMDDhhmmssToDateTime

引入于:v23.9

将包含年份、月份、日期、小时、分钟和秒的数字转换为一个 DateTime。 此函数是函数 toYYYYMMDDhhmmss() 的反向操作。 如果输入不编码有效的 DateTime 值,则输出未定义。

语法

YYYYMMDDhhmmssToDateTime(YYYYMMDDhhmmss[, timezone])

参数

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

返回值

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

示例

示例

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

将时间间隔添加到指定的日期、日期和时间或字符串编码的日期或日期和时间中。 如果添加的结果超出数据类型的边界,则结果未定义。

语法

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)

参数

返回值

返回 datetimenum 天后的结果。 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)

参数

返回值

返回 datetimenum 小时后的结果 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_timenum 微秒后的结果 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)

参数

返回值

返回 datetimenum 毫秒后的结果 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)

参数

返回值

返回 datetimenum 分钟后的结果 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)

参数

返回值

返回 datetimenum 月份后的结果 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)

参数

返回值

返回 datetimenum 纳秒后的结果 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)

参数

返回值

返回 datetimenum 季度后的结果 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)

参数

返回值

返回 datetimenum 秒后的结果 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 的日期 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)

参数

返回值

返回 datetimenum 周后的结果 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)

参数

返回值

返回 datetimenum 年后的结果 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 的替代方法,请参见函数 timeDiff

语法

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

参数

  • unit — 结果的间隔类型。
单位可能值
纳秒nanosecond, nanoseconds, ns
微秒microsecond, microseconds, us, u
毫秒millisecond, milliseconds, ms
second, seconds, ss, s
分钟minute, minutes, mi, n
小时hour, hours, hh, h
day, days, dd, d
week, weeks, wk, ww
month, months, mm, m
季度quarter, quarters, qq, q
year, years, yyyy, yy
  • startdate — 第一个时间值进行减法(被减数)。 DateDate32DateTimeDateTime64
  • enddate — 第二个时间值进行减法(减数)。 DateDate32DateTimeDateTime64
  • timezone — 可选。时区名称。如果指定,则将其应用于 startdateenddate。如果未指定,则使用 startdateenddate 的时区。如果不相同,则结果未定义。 String

返回值

返回以单位表示的 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

更改 date or date 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

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])

参数

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

返回值

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

单位参数datetime 参数返回类型
年、季度、月、周Date32DateTime64DateDateTimeDate32Date
天、小时、分钟、秒Date32DateTime64DateDateTimeDateTime64DateTime
毫秒、微秒、任何DateTime64
纳秒精度为 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 docs

此函数的反向操作是 parseDateTime

使用替换字段,你可以定义结果字符串的模式。 下表中的示例列显示 2018-01-02 22:33:44 的格式化结果。

替换字段:

占位符描述示例
%a缩写的星期几名称(周一-周日)Mon
%b缩写的月份名称(1月-12月)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完整的月份名称(1月-12月)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
%y年的最后两位数字(00-99)18
%Y2018
%zUTC 时间偏移,格式为 +HHMM 或 -HHMM-0500
%%百分号%
  • 在 v23.4 之前的 ClickHouse 版本中,如果格式化值为 Date,Date32 或 DateTime(没有小数秒)或 DateTime64 的精度为 0,则 %f 会打印一个零(0)。
  • 在 v25.1 之前的 ClickHouse 版本中,%f 将打印 DateTime64 指定的位数而不是固定的 6 位数字。
  • 在 v23.4 之前的 ClickHouse 版本中,%M 打印分钟(00-59),而不是完整的月份名称(1月-12月)。

语法

formatDateTime(datetime, format[, timezone])

参数

  • 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 documentation

此函数的反向操作是 parseDateTimeInJodaSyntax

使用替换字段,你可以定义结果字符串的模式。

替换字段:

占位符描述表现示例
G纪元文本AD
C纪元的世纪(>=0)数字20
Y纪元年份(>=0)年份1996
x周年(尚不支持)年份1996
w周年中的周(尚不支持)数字27
e星期几数字2
E星期几文本Tuesday; Tue
y年份年份1996
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 定义的前瞻性格里高尔日历 中相应的日期。

该计算与 MySQL 的 FROM_DAYS() 函数相同。如果在 Date 类型的范围内不能表示,结果是未定义的。

语法

fromDaysSinceYearZero(days)

参数

  • days — 自公元零年起经过的天数。 UInt32

返回值

返回自公元零年起经过的天数对应的日期。 Date

示例

将自公元零年起的天数转换为日期

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 — 自公元零年起经过的天数。 UInt32

返回值

返回自公元零年起经过的天数对应的日期。 Date32

示例

将自公元零年起的天数转换为日期

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 — 修订的儒略日数字。 (U)Int*

返回值

返回文本形式的日期。 String

示例

将修订的儒略日转换为日期

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

fromModifiedJulianDayOrNull

引入于:v21.1

类似于 fromModifiedJulianDay(),但不引发异常,而是返回 NULL

语法

fromModifiedJulianDayOrNull(day)

参数

  • day — 修订的儒略日数字。 (U)Int*

返回值

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

示例

在处理 null 时将修订的儒略日转换为日期

SELECT fromModifiedJulianDayOrNull(58849);
SELECT fromModifiedJulianDayOrNull(60000000); -- invalid argument, returns NULL
┌─fromModified⋯Null(58849)─┐
│ 2020-01-01               │
└──────────────────────────┘
┌─fromModified⋯l(60000000)─┐
│ ᴺᵁᴸᴸ                     │
└──────────────────────────┘

fromUTCTimestamp

引入于:v22.1

将来自 UTC 时区的日期或带时间的值转换为指定时区的日期或带时间的值。此函数主要是为了与 Apache Spark 等框架的兼容性而包含。

语法

fromUTCTimestamp(datetime, time_zone)

参数

  • datetime — 常量值或表达式中的日期或带时间的日期。 DateTimeDateTime64
  • time_zone — 表示时区的常量字符串类型值或表达式。 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]])

参数

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

返回值

当以一个参数调用时返回时间戳的 DateTime,或以两个或三个参数调用时返回字符串。 DateTimeString

示例

将 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(year, month, day)
makeDate(year, day_of_year)

参数

返回值

返回由提供的参数构造的 DateDate

示例

从年份、月份和日期创建日期

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)

参数

返回值

返回由提供的参数构造的 Date32Date32

示例

从年份、月份和日期创建 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])

参数

返回值

返回由提供的参数构造的 DateTimeDateTime

示例

从年份、月份、日期、小时、分钟、秒创建 DateTime

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

makeDateTime64

引入于:v22.6

从年份、月份、日期、小时、分钟、秒创建 DateTime64,可选的小数部分、精度和时区。

语法

makeDateTime64(year, month, day, hour, minute, second[, fraction[, precision[, timezone]]])

参数

返回值

返回由提供的参数构造的 DateTime64DateTime64

示例

从年份、月份、日期、小时、分钟、秒创建 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])

参数

  • 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 — 可选。 Tick 大小(精度): 10^-precision 秒。有效范围:[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 — 可选。 Tick 大小(精度): 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()

参数

  • 返回值

返回服务器时区,类型为 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 — 要从中减去指定天数的日期或带时间的日期。 DateDate32DateTime 或 [DateTime64](/sql-reference/data-types/datetime64)或 String
  • num — 要减去的天数。 (U)Int*Float*

返回值

返回 datetime 减去 numDateDate32DateTimeDateTime64

示例

从不同日期类型减去天数

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 — 要从中减去指定小时的日期或带时间的日期。 Date 或 [Date32](/sql-reference/data-types/date32)或 DateTime 或 [DateTime64](/sql-reference/data-types/datetime64)或 String
  • num — 要减去的小时数。 (U)Int*Float*

返回值

返回 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)

参数

返回值

返回间隔元组 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 — 带时间的日期,减去指定的微秒数。 DateTime 或 [DateTime64](/sql-reference/data-types/datetime64)或 String
  • num — 要减去的微秒数。 (U)Int*Float*

返回值

返回 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)

参数

返回值

返回减去 intervals 后的日期 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

示例

从不同日期类型中减去周

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
┌─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

返回 startdateenddate 之间跨越的指定 unit 边界的数量。差异通过相对单位计算。例如,2021-12-29 和 2022-01-01 之间的差异为3天,单位为天(参见 [toRelativeDayNum](#toRelativeDayNum)),单位为月为1个月(参见 [toRelativeMonthNum](#toRelativeMonthNum)),单位为年为1年(参见 [toRelativeYearNum](#toRelativeYearNum))。

如果指定了单位 week,则 timeDiff 假定周从星期一开始。请注意,此行为与 toWeek() 函数的行为不同,后者默认周从星期天开始。

关于 [timeDiff](#timeDiff)的替代方案,请参见函数 [age](#age)。

语法

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

参数

  • 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 timeDiff('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,
    timeDiff('day', s, e) AS day_diff,
    timeDiff('month', s, e) AS month_diff,
    timeDiff('year', s, e) AS year_diff
┌──────────e─┬──────────s─┬─day_diff─┬─month_diff─┬─year_diff─┐
│ 2022-01-01 │ 2021-12-29 │        3 │          1 │         1 │
└────────────┴────────────┴──────────┴────────────┴───────────┘

timeSlot

引入于:v1.1

将时间四舍五入到半小时长度间隔的开始。

备注

虽然这个函数可以接收扩展类型 Date32DateTime64 的值作为参数,但将其传递一个超出正常范围(1970 年至 2149 年的年份对于 Date / 2106 年对于 DateTime)的时间将产生错误结果。

语法

timeSlot(time[, time_zone])

参数

  • time — 要四舍五入到半小时长度间隔开始的时间。DateTimeDate32DateTime64
  • time_zone — 可选。一个字符串类型常量或表示时区的表达式。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,返回值的比例可能与 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 值,或添加时间后的 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()

参数

  • 无。

返回值

返回规格化的时区名称,作为 String

示例

用法示例

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

timezoneOf

引入于:v21.4

返回 DateTimeDateTime64 值的时区名称。

语法

timeZoneOf(datetime)

参数

  • datetime — 类型值。DateTimeDateTime64
  • timezone — 可选。要转换 datetime 值时区的时区名称。String

返回值

返回 datetime 的时区名称 String

示例

用法示例

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

timezoneOffset

引入于:v21.6

返回与 UTC 的时区偏移(以秒为单位)。该函数考虑了在指定日期和时间的夏令时和历史时区变化。

语法

timeZoneOffset(datetime)

参数

返回值

返回与 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)

参数

返回值

返回给定日期/时间的月份日期 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]])

参数

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

返回值

返回给定 DateDateTime 的星期几 UInt8

示例

用法示例

-- The following date is April 21, 2023, which was a Friday:
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)

参数

返回值

返回给定日期或 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 定义的历法 计算。

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

语法

toDaysSinceYearZero(date[, time_zone])

参数

返回值

返回自日期 0000-01-01 以来的天数。UInt32

示例

计算自公元零年起的天数

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

toHour

引入于:v1.1

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

语法

toHour(datetime)

参数

返回值

返回 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)

参数

返回值

返回给定日期或带有时间的日期的该月最后一天的日期。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

返回值

返回给定日期之后最近的星期六或星期天的日期,具体取决于模式 DateDate32DateTimeDateTime64

示例

四舍五入到最近的星期六或星期天

SELECT
    toLastDayOfWeek(toDateTime('2023-04-21 10:20:30')), /* a Friday */
    toLastDayOfWeek(toDateTime('2023-04-21 10:20:30'), 1), /* a Friday */
    toLastDayOfWeek(toDate('2023-04-23')), /* a Sunday */
    toLastDayOfWeek(toDate('2023-04-23'), 1) /* a Sunday */
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)

参数

返回值

返回 datetime 中的毫秒(0 - 999)。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)

参数

返回值

返回 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

Proleptic Gregorian calendar 形式的日期 YYYY-MM-DD 转换为 Modified Julian Day 编号(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'); -- invalid date, returns 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')), -- A Friday
toMonday(toDate('2023-04-24'));              -- Already a Monday
┌─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)

参数

返回值

返回给定日期/时间的月份 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)

参数

返回值

返回给定日期/时间的季度 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)

参数

返回值

返回 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)

参数

返回值

返回向下舍入到最近的十五分钟间隔的带时间的日期 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

将带时间的日期向下舍入到最近的五分钟间隔的开始。

备注

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

语法

toStartOfFiveMinutes(datetime)

参数

返回值

返回向下舍入到最近的五分钟间隔的带时间的日期 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年可能与常规年份不同。请参见 ISO week date

备注

返回值类型可以通过设置 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) 相同的结果。

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

间隔开始
YEAR年 0
QUARTER1900 Q1
MONTH1900年1月
WEEK1970年第1周 (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(午夜)进行。因此,只有1到23之间的小时值是有用的。

如果指定了单位 WEEKtoStartOfInterval 假定周从星期一开始。请注意,该行为不同于默认从星期日开始的 toStartOfWeek 函数。

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

语法

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

参数

  • 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
Row 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

将带时间的日期向下舍入到最近的十分钟间隔的开始。

备注

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

语法

toStartOfTenMinutes(datetime)

参数

返回值

返回向下舍入到最近的十分钟间隔的带时间的日期 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

返回值

返回在给定日期之前或最近的星期日或星期一的日期,具体取决于模式 DateDate32DateTimeDateTime64

示例

舍入到最近的星期日或星期一

SELECT
        toStartOfWeek(toDateTime('2023-04-21 10:20:30')), /* a Friday */
        toStartOfWeek(toDateTime('2023-04-21 10:20:30'), 1), /* a Friday */
        toStartOfWeek(toDate('2023-04-24')), /* a Monday */
        toStartOfWeek(toDate('2023-04-24'), 1) /* a Monday */
    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)

参数

返回值

返回与输入相同的时间戳,但时区为指定的时区 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;
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

toUTCTimestamp

引入于:v23.8

将日期或带时间的值从一个时区转换为 UTC 时区时间戳。此函数主要是为了与 Apache Spark 和类似框架的兼容性。

语法

toUTCTimestamp(datetime, time_zone)

参数

  • datetime — 日期或带时间类型的常量值或表达式。 DateTimeDateTime64
  • time_zone — 字符串类型常量值或表示时区的表达式。 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

该函数返回日期或日期时间的周数。toWeek() 的两个参数形式使您能够指定一周的起始日 为星期日或星期一,以及返回值是否应该在 053 的范围内,还是在 153 的范围内。

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

下表描述了模式参数的运作方式。

模式一周的第一天范围第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周。 这不论新年中包含多少天,即使只包含一天。 即,如果12月的最后一周包含下一年的1月1日,则该周将是下一年的第1周。

第一个参数也可以指定为 String格式,该格式受到 parseDateTime64BestEffort() 支持。字符串参数的支持仅出于与某些第三方工具的兼容性的目的。由于字符串参数的解析通常很慢,因此建议不要使用它。

语法

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

参数

  • 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 + DD)。 UInt32

示例

将当前日期转换为 YYYYMMDD 格式

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

toYYYYMMDDhhmmss

引入于:v1.1

将日期或带时间的日期转换为一个包含年份、月份、日期、小时、分钟和秒的 UInt64 数字(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)

参数

返回值

返回给定日期或日期时间的年份 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() 返回 0toYearWeek() 返回对应于前一年最后一周的值。请参见下面示例中的 prev_yearWeek

第一个参数也可以作为 StringparseDateTime64BestEffort() 支持的格式指定。字符串参数的支持仅因兼容某些第三方工具的 MySQL 而存在。由于字符串参数支持未来可能依赖于新的 MySQL 兼容设置,并且字符串解析通常较慢,因此不推荐使用。

语法

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

参数

  • datetime — 要获取年份和周数的日期或带时间的日期。 DateDateTime
  • mode — 可选。模式 09 决定每周的第一天和周数范围。默认 0。 - timezone — 可选。时区。 String

返回值

以组合整数值返回年份和周数。 UInt32

示例

获取具有不同模式的年-周组合

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()

参数

  • 无。 返回值

返回当前日期 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 │
└───────────────────┘