@@ -5,168 +5,146 @@ description: Databend 的日期和时间数据类型支持标准化,并与各
55
66import FunctionDescription from '@site/src /components/FunctionDescription';
77
8- <FunctionDescription description =" 引入或更新于: v1.2.745 " />
8+ <FunctionDescription description =" 引入或更新于: v1.2.834 " />
99
1010## 日期和时间数据类型
1111
1212| 名称 | 别名 | 存储大小 | 精度 | 最小值 | 最大值 | 格式 |
1313| -----------| ----------| ----------| -------------| ----------------------------| --------------------------------| --------------------------------------------------------------------------------|
1414| DATE | | 4 字节 | 天 | 0001-01-01 | 9999-12-31 | ` YYYY-MM-DD ` |
1515| TIMESTAMP | DATETIME | 8 字节 | 微秒 | 0001-01-01 00:00:00.000000 | 9999-12-31 23:59:59.999999 UTC | ` YYYY-MM-DD hh:mm:ss[.fraction] ` ,支持最多 6 位微秒精度 |
16+ | TIMESTAMP_TZ | TIMESTAMP WITH TIME ZONE | 8 字节 | 微秒 | 0001-01-01 00:00:00.000000 | 9999-12-31 23:59:59.999999 UTC | ` YYYY-MM-DD hh:mm:ss[.fraction]±hh:mm ` ,存储 UTC 值和时区偏移 |
1617
18+ ## DATE
1719
18- ## 示例
20+ DATE 类型用于存储日历日期(年、月、日)。
1921
2022``` sql
21- CREATE TABLE test_dt
22- (
23- date DATE ,
24- ts TIMESTAMP
25- );
26- ```
23+ CREATE TABLE events (
24+ event_date DATE
25+ );
2726
28- ``` sql
29- DESC test_dt;
30- ```
27+ INSERT INTO events VALUES
28+ ( ' 2024-01-15 ' ),
29+ ( ' 2024-12-31 ' );
3130
32- 结果:
31+ SELECT * FROM events;
32+ ```
3333
34+ 结果:
3435```
35- ┌──────────────────────────────────────────────── ┐
36- │ Field │ Type │ Null │ Default │ Extra │
37- ├────────┼───────────┼────────┼─────────┼──── ────┤
38- │ date │ DATE │ YES │ NULL │ │
39- │ ts │ TIMESTAMP │ YES │ NULL │ │
40- └──────────────────────────────────────────────── ┘
36+ ┌────────────┐
37+ │ event_date │
38+ ├────────────┤
39+ │ 2024-01-15 │
40+ │ 2024-12-31 │
41+ └────────────┘
4142```
4243
43- TIMESTAMP 值可以选择性地包含尾随的小数秒部分,精度最高可达微秒 (6 位数字)。
44+ ## TIMESTAMP
45+
46+ TIMESTAMP 在内部以 UTC 格式存储时间点,但会根据会话的时区设置来显示。当您希望不同用户在各自的本地时区查看时间时,这很有用。
4447
4548``` sql
46- -- 向表中插入值
47- INSERT INTO test_dt
48- VALUES
49- (' 2022-04-07' , ' 2022-04-07 01:01:01.123456' ),
50- (' 2022-04-08' , ' 2022-04-08 01:01:01' );
51-
52- SELECT *
53- FROM test_dt;
54- ```
49+ CREATE TABLE meetings (
50+ meeting_id INT ,
51+ meeting_time TIMESTAMP
52+ );
5553
56- 结果:
54+ -- 插入一个会议时间
55+ INSERT INTO meetings VALUES (1 , ' 2024-01-15 14:00:00+08:00' );
5756
58- ```
59- ┌─────────────────────────────────────────────┐
60- │ date │ ts │
61- ├────────────────┼────────────────────────────┤
62- │ 2022-04-07 │ 2022-04-07 01:01:01.123456 │
63- │ 2022-04-08 │ 2022-04-08 01:01:01 │
64- └─────────────────────────────────────────────┘
57+ -- 在 UTC 时区查看
58+ SET timezone = ' UTC' ;
59+ SELECT * FROM meetings;
6560```
6661
67- Databend 识别多种格式的 TIMESTAMP 值。
68-
69- ``` sql
70- -- 创建表来测试不同的时间戳格式
71- CREATE TABLE test_formats (
72- id INT ,
73- a TIMESTAMP
74- );
75-
76- -- 插入不同时间戳格式的值
77- INSERT INTO test_formats
78- VALUES
79- (1 , ' 2022-01-01 02:00:11' ),
80- (2 , ' 2022-01-02T02:00:22' ),
81- (3 , ' 2022-02-02T04:00:03+00:00' ),
82- (4 , ' 2022-02-03' );
62+ 结果:
63+ ```
64+ ┌────────────┬─────────────────────┐
65+ │ meeting_id │ meeting_time │
66+ ├────────────┼─────────────────────┤
67+ │ 1 │ 2024-01-15 06:00:00 │
68+ └────────────┴─────────────────────┘
8369```
8470
8571``` sql
86- SELECT *
87- FROM test_formats ;
88-
72+ -- 在纽约时区查看
73+ SET timezone = ' America/New_York ' ;
74+ SELECT * FROM meetings;
8975```
9076
91- 结果:
92-
77+ 结果:
9378```
94- ┌───────────────────────────────────────┐
95- │ id │ a │
96- ├─────────────────┼─────────────────────┤
97- │ 1 │ 2022-01-01 02:00:11 │
98- │ 2 │ 2022-01-02 02:00:22 │
99- │ 3 │ 2022-02-02 04:00:03 │
100- │ 4 │ 2022-02-03 00:00:00 │
101- └───────────────────────────────────────┘
79+ ┌────────────┬─────────────────────┐
80+ │ meeting_id │ meeting_time │
81+ ├────────────┼─────────────────────┤
82+ │ 1 │ 2024-01-15 01:00:00 │
83+ └────────────┴─────────────────────┘
10284```
10385
104- Databend 会根据您当前的时区自动调整并显示 TIMESTAMP 值。
86+ 同一个时间戳会根据会话时区设置显示为不同的值。
87+
88+ ## TIMESTAMP_TZ
89+
90+ TIMESTAMP_TZ 同时存储 UTC 时间和原始时区偏移。显示时始终包含偏移量,且不受会话时区影响。这对于审计日志、金融交易或需要保留确切时区上下文的场景非常有用。
10591
10692``` sql
107- -- 创建表来测试带时区调整的时间戳值
108- CREATE TABLE test_tz (
109- id INT ,
110- t TIMESTAMP
93+ CREATE TABLE system_logs (
94+ log_id INT ,
95+ log_time TIMESTAMP_TZ
11196);
11297
113- -- 设置时区为 UTC
114- SET timezone = ' UTC' ;
98+ -- 插入来自不同地点的日志
99+ INSERT INTO system_logs VALUES
100+ (1 , ' 2024-01-15 14:00:00+08:00' ), -- 北京
101+ (2 , ' 2024-01-15 06:00:00+00:00' ), -- UTC
102+ (3 , ' 2024-01-15 01:00:00-05:00' ); -- 纽约
115103
116- -- 插入考虑不同时区的时间戳值
117- INSERT INTO test_tz
118- VALUES
119- (1 , ' 2022-02-03T03:00:00' ),
120- (2 , ' 2022-02-03T03:00:00+08:00' ),
121- (3 , ' 2022-02-03T03:00:00-08:00' ),
122- (4 , ' 2022-02-03' ),
123- (5 , ' 2022-02-03T03:00:00+09:00' ),
124- (6 , ' 2022-02-03T03:00:00+06:00' );
104+ -- 使用任意会话时区查看
105+ SET timezone = ' UTC' ;
106+ SELECT * FROM system_logs;
125107```
126108
109+ 结果:
127110```
128- SELECT *
129- FROM test_tz;
111+ ┌────────┬───────────────────────────┐
112+ │ log_id │ log_time │
113+ ├────────┼───────────────────────────┤
114+ │ 1 │ 2024-01-15 14:00:00+08:00 │
115+ │ 2 │ 2024-01-15 06:00:00+00:00 │
116+ │ 3 │ 2024-01-15 01:00:00-05:00 │
117+ └────────┴───────────────────────────┘
130118```
131119
132- 结果:
120+ ``` sql
121+ -- 更改会话时区
122+ SET timezone = ' Asia/Shanghai' ;
123+ SELECT * FROM system_logs;
124+ ```
133125
126+ 结果:
134127```
135- ┌───────────────────────────────────────┐
136- │ id │ t │
137- ├─────────────────┼─────────────────────┤
138- │ 1 │ 2022-02-03 03:00:00 │
139- │ 2 │ 2022-02-02 19:00:00 │
140- │ 3 │ 2022-02-03 11:00:00 │
141- │ 4 │ 2022-02-03 00:00:00 │
142- │ 5 │ 2022-02-02 18:00:00 │
143- │ 6 │ 2022-02-02 21:00:00 │
144- └───────────────────────────────────────┘
128+ ┌────────┬───────────────────────────┐
129+ │ log_id │ log_time │
130+ ├────────┼───────────────────────────┤
131+ │ 1 │ 2024-01-15 14:00:00+08:00 │
132+ │ 2 │ 2024-01-15 06:00:00+00:00 │
133+ │ 3 │ 2024-01-15 01:00:00-05:00 │
134+ └────────┴───────────────────────────┘
145135```
146136
147- ``` sql
148- -- 将时区更改为 Asia/Shanghai
149- SET timezone = ' Asia/Shanghai' ;
137+ 时区偏移始终被保留并显示。
150138
151- -- 使用新的时区设置从表中选择数据
152- SELECT *
153- FROM test_tz;
154- ```
139+ ::: note
140+ TIMESTAMP_TZ 只存储数值偏移(如 ` +08:00 ` ),而不存储时区名称。该偏移量不会随夏令时变化而自动调整。
141+ :::
155142
156- 结果:
143+ ## 选择合适的类型
157144
158- ```
159- ┌───────────────────────────────────────┐
160- │ id │ t │
161- ├─────────────────┼─────────────────────┤
162- │ 1 │ 2022-02-03 11:00:00 │
163- │ 2 │ 2022-02-03 03:00:00 │
164- │ 3 │ 2022-02-03 19:00:00 │
165- │ 4 │ 2022-02-03 08:00:00 │
166- │ 5 │ 2022-02-03 02:00:00 │
167- │ 6 │ 2022-02-03 05:00:00 │
168- └───────────────────────────────────────┘
169- ```
145+ - 使用 ** DATE** 存储不包含时间信息的日历日期
146+ - 使用 ** TIMESTAMP** 当您希望时间在每个用户的本地时区显示
147+ - 使用 ** TIMESTAMP_TZ** 当您需要保留原始时区上下文
170148
171149## 函数
172150
0 commit comments