You need to enable JavaScript to run this app.
导航
日期时间 DateTime DateTime64
最近更新时间:2025.09.01 12:09:53首次发布时间:2024.12.16 16:16:56
复制全文
我的收藏
有用
有用
无用
无用

DateTime

时间戳类型。用四个字节(无符号的)存储 Unix 时间戳。允许存储与日期类型相同的范围内的值。最小值为 1970-01-01 00:00:00。时间戳类型值精确到秒(没有闰秒)。
值的范围:[1970-01-01 00:00:00, 2106-02-07 06:28:15]。

时区

使用启动客户端或服务器时的系统时区,时间戳是从文本(分解为组件)转换为二进制并返回。在文本格式中,有关夏令时的信息会丢失。
默认情况下,客户端连接到服务的时候会使用服务端时区。您可以通过启用客户端命令行选项 --use_client_time_zone 来设置使用客户端时间。
因此,在处理文本日期时(例如,在保存文本转储时),请记住在夏令时更改期间可能存在歧义,如果时区发生更改,则可能存在匹配数据的问题。

DateTime64

此类型允许以日期(date)加时间(time)的形式来存储一个时刻的时间值,具有定义的亚秒精度。
时间刻度大小(精度):10-精度 秒
语法:

DateTime64(precision, [timezone])

在内部,此类型以Int64类型将数据存储为自Linux纪元开始(1970-01-01 00:00:00UTC)的时间刻度数(ticks)。时间刻度的分辨率由precision参数确定。此外,DateTime64 类型可以像存储其他数据列一样存储时区信息,时区会影响 DateTime64 类型的值如何以文本格式显示,以及如何解析以字符串形式指定的时间数据 (‘2020-01-01 05:00:01.000’)。时区不存储在表的行中(也不在resultset中),而是存储在列的元数据中。详细信息请参考 DateTime 数据类型。
值的范围: [1900-01-01 00:00:00, 2299-12-31 23:59:59.99999999] (注意: 最大值的精度是8)。

示例

  1. 创建一个具有 DateTime64 类型列的表,并向其中插入数据:

    CREATE TABLE dt
    (
        `timestamp` DateTime64(3, 'Asia/Istanbul'),
        `event_id` UInt8
    )
    ENGINE = TinyLog
    
    INSERT INTO dt Values (1546300800000, 1), ('2019-01-01 00:00:00', 2) 
    
    SELECT * FROM dt 
    
    ┌───────────────timestamp─┬─event_id─┐
    │ 2019-01-01 03:00:00.000 │        1 │
    │ 2019-01-01 00:00:00.000 │        2 │
    └─────────────────────────┴──────────┘
    

    将日期时间作为integer类型插入时,它会被视为适当缩放的Unix时间戳(UTC)。1546300800000 (精度为3)表示 '2019-01-01 00:00:00' UTC。不过,因为 timestamp 列指定了 Asia/Istanbul (UTC+3)的时区,当作为字符串输出时,它将显示为 '2019-01-01 03:00:00'
    当把字符串作为日期时间插入时,它会被赋予时区信息。 '2019-01-01 00:00:00' 将被认为处于 Asia/Istanbul 时区并被存储为 1546290000000

  2. 过滤 DateTime64 类型的值。

    SELECT * FROM dt WHERE timestamp = toDateTime64('2019-01-01 00:00:00', 3, 'Asia/Istanbul')
    
    ┌───────────────timestamp─┬─event_id─┐
    │ 2019-01-01 00:00:00.000 │        2 │
    └─────────────────────────┴──────────┘
    

    DateTime 不同, DateTime64 类型的值不会自动从 String 类型的值转换过来。

  3. 获取 DateTime64 类型值的时区信息:

    SELECT toDateTime64(now(), 3, 'Asia/Istanbul') AS column, toTypeName(column) AS x
    
    ┌──────────────────column─┬─x──────────────────────────────┐
    │ 2019-10-16 04:12:04.000 │ DateTime64(3, 'Asia/Istanbul') │
    └─────────────────────────┴────────────────────────────────┘
    
  4. 时区转换:

    SELECT
    toDateTime64(timestamp, 3, 'Europe/London') as lon_time,
    toDateTime64(timestamp, 3, 'Asia/Istanbul') as mos_time
    FROM dt
    
    ┌───────────────lon_time──┬────────────────mos_time─┐
    │ 2019-01-01 00:00:00.000 │ 2019-01-01 03:00:00.000 │
    │ 2018-12-31 21:00:00.000 │ 2019-01-01 00:00:00.000 │
    └─────────────────────────┴─────────────────────────┘