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

Time64

数据类型 Time64 表示带有小数秒的一天中的时刻(time-of-day)。 它不包含任何日历日期组件(日、月、年)。 参数 precision 定义小数位数,因此也就定义了最小时间粒度(tick size)。

时间粒度(精度):10-precision 秒。有效范围:0..9。常用取值为 3(毫秒)、6(微秒)和 9(纳秒)。

语法:

Time64(精度)

在内部,Time64 以有符号 64 位十进制数(Decimal64)的形式存储秒的小数部分。 时间精度由 precision 参数决定。 不支持时区:为 Time64 指定时区会抛出错误。

DateTime64 不同,Time64 不存储日期部分。 另见 Time

文本表示范围:当 precision = 3 时为 [-999:59:59.000, 999:59:59.999]。一般情况下,最小值为 -999:59:59,最大值为 999:59:59,并且最多带有 precision 位小数(例如,当 precision = 9 时,最小值为 -999:59:59.999999999)。

实现细节

表示形式
带符号的 Decimal64 值,用于表示具有 precision 位小数的秒的小数部分。

规范化
将字符串解析为 Time64 时,时间组件会被规范化,而不会进行合法性校验。
例如,25:70:70 会被解释为 26:11:10

负值
支持并保留前导负号。
负值通常来源于对 Time64 值进行算术运算。
对于 Time64,文本输入(例如 '-01:02:03.123')和数值输入(例如 -3723.123)中的负值都会被保留。

饱和
在拆解为组件或序列化为文本时,一天中的时间部分会被限制在区间 [-999:59:59.xxx, 999:59:59.xxx] 内。
存储的数值可能超出该范围;然而,任何组件提取(小时、分钟、秒)和文本表示都会使用饱和值。

时区
Time64 不支持时区。
在创建 Time64 类型或值时指定时区会抛出错误。
同样,尝试对 Time64 列应用或更改时区也不被支持,并会导致错误。

示例

  1. 创建一个包含 Time64 类型列的表,并向其中插入数据:
CREATE TABLE tab64
(
    `event_id` UInt8,
    `time` Time64(3)
)
ENGINE = TinyLog;
-- 解析 Time64
-- - 从字符串解析,
-- - 从自 00:00:00 起的秒数解析(小数部分根据精度确定)。
INSERT INTO tab64 VALUES (1, '14:30:25'), (2, 52225.123), (3, '14:30:25');

SELECT * FROM tab64 ORDER BY event_id;
   ┌─event_id─┬────────time─┐
1. │        1 │ 14:30:25.000 │
2. │        2 │ 14:30:25.123 │
3. │        3 │ 14:30:25.000 │
   └──────────┴──────────────┘
  1. Time64 值进行过滤
SELECT * FROM tab64 WHERE time = toTime64('14:30:25', 3);
   ┌─event_id─┬────────time─┐
1. │        1 │ 14:30:25.000 │
2. │        3 │ 14:30:25.000 │
   └──────────┴──────────────┘
SELECT * FROM tab64 WHERE time = toTime64(52225.123, 3);
   ┌─event_id─┬────────time─┐
1. │        2 │ 14:30:25.123 │
   └──────────┴──────────────┘

注意:toTime64 会根据指定的精度,将数字字面量解析为带有小数部分的秒数,因此请显式提供预期的小数位数。

  1. 检查结果类型:
SELECT CAST('14:30:25.250' AS Time64(3)) AS column, toTypeName(column) AS type;
   ┌────────column─┬─type──────┐
1. │ 14:30:25.250 │ Time64(3) │
   └───────────────┴───────────┘

另请参阅