You need to enable JavaScript to run this app.
文档中心
ByteHouse 企业版

ByteHouse 企业版

复制全文
下载 pdf
数据类型
日期时间 DateTime DateTime64
复制全文
下载 pdf
日期时间 DateTime DateTime64

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 │
    └─────────────────────────┴─────────────────────────┘
    
最近更新时间:2025.09.01 12:09:53
这个页面对您有帮助吗?
有用
有用
无用
无用