TIMESTAMP_NTZ
概述
timestamp_ntz即timestamp without time zone 是一种数据库数据类型,用于存储不包含时区信息的日期和时间值。这意味着存储的时间值是绝对的,不考虑时区的变化。无论用户在哪个时区,timestamp without time zone 类型的字段显示的时间都是一样的,使用 timestamp without time zone 类型时,通常需要应用程序或用户自己来管理时区转换,因为数据库不会自动处理时区信息。这种类型适用于那些不需要考虑时区差异的场景。timestamp_ntz等效于Mysql中的datetime。
语法
说明
timestamp_ntz
类型当前支持 JDBC 客户端版本 1.4.0 及以上的 JDBC JAR 包
timestamp_ntz常量格式
TIMESTAMP_NTZ
timestampString
{ 'yyyy[...]' |
'yyyy[...]-[M]M' |
'yyyy[...]-[M]M-[d]d' |
'yyyy[...]-[M]M-[d]d ' |
'yyyy[...]-[M]M-[d]d[T][H]H[:]' |
'yyyy[..]-[M]M-[d]d[T][H]H:[m]m[:]' |
'yyyy[...]-[M]M-[d]d[T][H]H:[m]m:[s]s[.]' |
'yyyy[...]-[M]M-[d]d[T][H]H:[m]m:[s]s.[ms][ms][ms][us][us][us]' }
yyyy
:一个至少包含四位数字的年份。
[M]M
:介于 01 和 12 之间的一位数或两位数的月份。
[d]d
:介于 01 和 31 之间的一位数或两位数的日期。
H[H]
:介于 00 和 23 之间的一位数或两位数的小时。
m[m]
:介于 00 和 59 之间的一位数或两位数的分钟。
s[s]
:介于 00 和 59 之间的一位数或两位数的秒。
[ms][ms][ms][us][us][us]
:秒最多 6 位小数。
SELECT TIMESTAMP_NTZ'2020-12-31';
+---------------------------+
| TIMESTAMP_NTZ'2020-12-31' |
+---------------------------+
| 2020-12-31 00:00:00 |
+---------------------------+
SELECT TIMESTAMP_NTZ'2021-7-1T8:43:28.123456' as res;
+----------------------------+
| res |
+----------------------------+
| 2021-07-01 08:43:28.123456 |
+----------------------------+
SELECT TIMESTAMP_NTZ'2021-7-1 8:43:28.123456' as res;
+----------------------------+
| res |
+----------------------------+
| 2021-07-01 08:43:28.123456 |
+----------------------------+
如果输入的字符串中的格式则会转化为timestmap
timestamp_ntz和timestamp_ltz的区别
timestamp_ntz(没有时区的时间戳): 这种类型的时间戳记录的是“墙上时钟”时间,即不考虑任何时区信息的时间。所有的操作都是在没有考虑时区的情况下进行的。如果输出格式包含时区,将显示UTC指示符(Z)。这意味着,无论你在世界上的哪个地方,timestamp_ntz记录的时间都是相同的。
timestamp_ltz(本地时区的时间戳): 这种类型的时间戳在内部存储UTC时间,并根据当前会话的时区进行所有操作。这意味着,当你查询一个timestamp_ltz类型的字段时,你看到的时间将是转换为你当前会话时区的时间。这使得在全球分布的系统中工作时,用户可以看到转换为他们本地时区的时间。
如下所示:本地客户端的时区为utc+00区。timestamp_ltz会根据字符输入的时区进行转化内部存储UTC时间,由于客户端也在utc+00区,所以查出来会转化为utc+00时间。而timestamp_ntz不考虑任何时区所以客户端在任何时区查出来都是该时间
SELECT timestamp_ltz'2022-03-30 06:00:00+08',timestamp_ntz'2022-03-30 06:00:00+08';
+---------------------------------------+---------------------------------------+
| timestamp_ltz'2022-03-30 06:00:00+08' | timestamp_ntz'2022-03-30 06:00:00+08' |
+---------------------------------------+---------------------------------------+
| 2022-03-29 22:00:00 | 2022-03-30 06:00:00 |
+---------------------------------------+---------------------------------------+
约束限制
- 不支持python sdk写入timestamp_ntz
具体案例
- 将timestmap_ntz转化为timestmap_ltz
SELECT cast(timestamp_ntz'2022-03-30 06:00:00' as timestamp_ltz);
+-------------------------------------------------------+
| CAST(timestamp_ntz'2022-03-30 06:00:00' AS timestamp) |
+-------------------------------------------------------+
| 2022-03-30 06:00:00 |
+-------------------------------------------------------+
- 将timestmap_lt转化为timestmap_ntz
SELECT cast(timestamp_ltz'2022-03-30 06:00:00+08' as timestamp_ntz);
+--------------------------------------------------------------+
| CAST(timestamp_ltz'2022-03-30 06:00:00+08' AS timestamp_ntz) |
+--------------------------------------------------------------+
| 2022-03-30 06:00:00 |
+--------------------------------------------------------------+
- 建表时使用timestamp_ntz字段数据类型
CREATE TABLE timestamp_wihtout_timezone (col timestamp_ntz);
- 插入timestamp_ntz类型数据
INSERT INTO timestamp_wihtout_timezone
VALUES (timestamp_ntz '2022-03-30 06:00:00');
- 使用函数处理
SELECT year(timestamp_ntz '2022-03-30 06:00:00');
+--------------------------------------------+
| `year`(timestamp_ntz'2022-03-30 06:00:00') |
+--------------------------------------------+
| 2022 |
+--------------------------------------------+
SELECT month(timestamp_ntz '2022-03-30 06:00:00');
+---------------------------------------------+
| `month`(timestamp_ntz'2022-03-30 06:00:00') |
+---------------------------------------------+
| 3 |
+---------------------------------------------+