TIMESTAMP_NTZ
TIMESTAMP_NTZ
TIMESTAMP_NTZ
(timestamp without time zone)存储不含时区信息的日期时间值。无论查询时会话处于哪个时区,读出的值始终是写入时的原始时间,不做任何转换。
与
TIMESTAMP
TIMESTAMP
(即
TIMESTAMP_LTZ
TIMESTAMP_LTZ
)的区别:
TIMESTAMP
TIMESTAMP
内部以 UTC 存储,查询时转换为会话时区显示;
TIMESTAMP_NTZ
TIMESTAMP_NTZ
不存储时区,写入什么显示什么。适合记录"本地时间"语义的事件,如日志时间戳、排班时间等。
语法
类型声明
TIMESTAMP_NTZ
字面量
TIMESTAMP_NTZ 'yyyy-[M]M-[d]d [T][H]H:[m]m:[s]s[.ffffff]'
- 日期部分必填,时间部分可省略(默认
00:00:00
00:00:00
)
- 支持
T
T
或空格作为日期时间分隔符
- 秒最多 6 位小数(微秒精度)
- 字面量中的时区偏移(如
+08
+08
)会被忽略,直接取时间部分存储
示例
字面量与基本查询
SELECT TIMESTAMP_NTZ'2024-03-15';
-- 返回:2024-03-15 00:00:00
SELECT TIMESTAMP_NTZ'2024-03-15 14:30:45.123456';
-- 返回:2024-03-15 14:30:45.123456
SELECT TIMESTAMP_NTZ'2024-03-15T14:30:45';
-- 返回:2024-03-15 14:30:45
建表与写入数据
CREATE TABLE doc_ntz_test (
id INT,
event_time TIMESTAMP_NTZ
);
INSERT INTO doc_ntz_test VALUES
(1, TIMESTAMP_NTZ'2024-03-15 09:00:00'),
(2, TIMESTAMP_NTZ'2024-03-15 17:30:00'),
(3, TIMESTAMP_NTZ'2024-03-16 08:00:00');
提取日期部分
SELECT id,
event_time,
date(event_time) AS event_date,
hour(event_time) AS event_hour
FROM doc_ntz_test
ORDER BY id;
结果:
| id | event_time | event_date | event_hour |
|---|
| 1 | 2024-03-15 09:00:00 | 2024-03-15 | 9 |
| 2 | 2024-03-15 17:30:00 | 2024-03-15 | 17 |
| 3 | 2024-03-16 08:00:00 | 2024-03-16 | 8 |
时间运算
SELECT TIMESTAMP_NTZ'2024-03-15 14:30:45' + INTERVAL 1 DAY;
-- 返回:2024-03-16 14:30:45
SELECT TIMESTAMP_NTZ'2024-03-15 14:30:45' - INTERVAL 2 HOUR;
-- 返回:2024-03-15 12:30:45
与 TIMESTAMP 的对比
SELECT
TIMESTAMP_LTZ'2024-06-15 08:00:00+08' AS ltz_val,
TIMESTAMP_NTZ'2024-06-15 08:00:00+08' AS ntz_val;
结果(会话时区 UTC+8):
| ltz_val | ntz_val |
|---|
| 2024-06-15 08:00:00 | 2024-06-15 08:00:00 |
TIMESTAMP_LTZ
TIMESTAMP_LTZ
将
+08
+08
转换为 UTC 内部存储,再按会话时区(UTC+8)显示,结果相同;但若会话时区为 UTC+0,
TIMESTAMP_LTZ
TIMESTAMP_LTZ
会显示
2024-06-15 00:00:00
2024-06-15 00:00:00
,而
TIMESTAMP_NTZ
TIMESTAMP_NTZ
始终显示
2024-06-15 08:00:00
2024-06-15 08:00:00
。
类型转换
-- TIMESTAMP_NTZ → TIMESTAMP(NTZ 值被视为会话时区的本地时间,而非 UTC)
SELECT CAST(TIMESTAMP_NTZ'2024-06-15 08:00:00' AS TIMESTAMP);
-- 返回(UTC+8 会话):2024-06-15 08:00:00
-- TIMESTAMP → TIMESTAMP_NTZ(先将 LTZ 转为会话时区,再以该值存入 NTZ)
SELECT CAST(TIMESTAMP'2024-06-15 08:00:00+08' AS TIMESTAMP_NTZ);
-- 返回:2024-06-15 08:00:00
-- TIMESTAMP_NTZ → DATE(截断时间部分)
SELECT CAST(TIMESTAMP_NTZ'2024-03-15 14:30:00' AS DATE);
-- 返回:2024-03-15
-- DATE → TIMESTAMP_NTZ(时间部分补零)
SELECT CAST(DATE'2024-03-15' AS TIMESTAMP_NTZ);
-- 返回:2024-03-15 00:00:00
注意事项
TIMESTAMP_NTZ
TIMESTAMP_NTZ
不存储时区,字面量中的时区偏移(+08
+08
、Z
Z
)会被忽略,直接取时间部分。
- 不支持 Python SDK 写入
TIMESTAMP_NTZ
TIMESTAMP_NTZ
;需要 JDBC 客户端 1.4.0 及以上版本。
TIMESTAMP_NTZ
TIMESTAMP_NTZ
不能用作 TABLE_CHANGES
TABLE_CHANGES
的时间参数(该参数只接受 TIMESTAMP_LTZ
TIMESTAMP_LTZ
)。
- 与
TIMESTAMP_LTZ
TIMESTAMP_LTZ
互转时注意语义:NTZ→LTZ
NTZ→LTZ
将 NTZ 的值视为会话时区的本地时间(不是 UTC)进行转换;LTZ→NTZ
LTZ→NTZ
先将 LTZ 转换为会话时区,然后以该值直接存入 NTZ。
⚠️ 常见误解:
NTZ→LTZ
NTZ→LTZ
不是"把 NTZ 值当 UTC 处理"。若会话时区为 UTC+8,
TIMESTAMP_NTZ'08:00:00' → TIMESTAMP
TIMESTAMP_NTZ'08:00:00' → TIMESTAMP
的结果是
08:00:00
08:00:00
(本地时间),而非
16:00:00
16:00:00
(错误理解为 UTC 加8小时)。
相关文档