Skip to content

适用虚谷数据库版本

v12.9



适用虚谷数据库版本

v12.9


时间数据类型

📄字数 4.5K
👁️阅读量 加载中...

XuguDB支持所有标准SQL时间类型,包括日期、时间、日期时间、时间戳、时间间隔。

时间类型相关分类如下表所示:

含义类型
日期DATE
时间TIME、TIME WITH TIME ZONE
日期类型DATETIME、DATETIME WITH TIME ZONE
时间戳TIMESTAMP、TIMESTAMP WITH TIME ZONE
时间间隔INTERVAL YEAR、INTERVAL MONTH、INTERVAL DAY、INTERVAL HOUR、INTERVAL MINUTE、INTERVAL SECOND、
INTERVAL YEAR TO MONTH、INTERVAL DAY TO HOUR、INTERVAL DAY TO MINUTE、INTERVAL DAY TO SECOND、
INTERVAL HOUR TO MINUTE、INTERVAL HOUR TO SECOND、INTERVAL MINUTE TO SECOND

日期类型

DATE类型是数据库中专门存储日历日期的数据类型,精确表示年、月、日,不包含时间成分,支持日期计算、比较和格式化操作。

  • 语法格式
sql
DATE

下表展示了DATE类型的字节格式、长度和表示范围:

数据类型格式字节长度范围
DATEYYYY-MM-DD4字节公元前:'9999-12-31 BC'到'0002-01-01 BC'
公元后:'0001-01-01'到'9999-12-31'

提示

  • 使用字符串或TO_DATE函数赋值,公元前、公元后日期分别以BC和AD表示,位于时间字符串末尾。
  • Oracle兼容模式时,DATE类型映射为DATETIME类型。

示例:

DATE类型,创建DATE类型字段表,插入数据和查询数据

sql
SQL> CREATE TABLE tab_date_test(col1 DATE);
 
SQL> INSERT INTO tab_date_test VALUES('2025-6-20');
  
SQL> SELECT * FROM tab_date_test;
+-------------+
|    COL1     |
+-------------+
| 2025-06-20  |
+-------------+

时间类型

TIME类型用于存储一天内的具体时刻,精确表示时、分、秒,不包含日期和时区信息;而TIME WITH TIME ZONE在时刻基础上附加时区偏移量,明确标识该时刻对应的时区位置,用于跨时区时间协调。

  • 语法格式
sql
TIME[size]
TIME WITH TIME ZONE
  • 可选size值用来指定小数位秒的精度,范围为[0,3]。0值表示小数部分截断, 如果省略,则默认精度为0。

提示

  • XuguDB控制台输出TIME类型可显示精度部分
  • 如果以JDBC输出TIME类型无精度部分

下表展示了时间类型的字节格式、长度和表示范围:

数据类型格式字节长度范围
TIMEHH24:MI:SS4字节'00:00:00.000'到'23:59:59.999
TIME WITH TIME ZONEHH24:MI:SS +UTC6字节'00:00:00.000'到'23:59:59.999
UTC:-12:59到+14:59

示例:
时间类型,创建TIME类型与TIME WITH TIME ZONE字段表,插入数据和查询数据

sql
SQL> CREATE TABLE tab_time_test(col1 TIME, col2 TIME WITH TIME ZONE);
 
SQL> INSERT INTO tab_time_test VALUES('15:16:25','17:30:29+08:00');
  
SQL> SELECT * FROM tab_time_test;
+--------------+-----------------+
|     COL1     |      COL2       |
+--------------+-----------------+
| 15:16:25.000 | 17:30:29 +08:00 |
+--------------+-----------------+

日期时间类型

DATETIME类型存储日期和时间,不包含时区信息;DATETIME WITH TIME ZONE在日期时间基础上附加时区偏移,明确记录特定时区的绝对时间,支持自动跨时区转换。

  • 语法格式
sql
DATETIME
DATETIME WITH TIME ZONE

提示

  • 使用字符串或TO_DATE函数赋值公元前、公元后日期分别以BC和AD表示,位于时间字符串末尾。

下表展示了日期时间类型的字节格式、长度和表示范围:

数据类型格式字节长度范围
DATETIMEYYYY-MM-DD HH24:MI:SS8字节公元前:'9999-12-31 23:59:59.999 BC'到'0002-01-01 00:00:00.000 BC'
公元后:'0001-01-01 00:00:00.000'到'9999-12-31 23:59:59.999'
DATETIME WITH TIME ZONEYYYY-MM-DD HH24:MI:SS +UTC10字节公元前:'9999-12-31 23:59:59.999 BC'到'0002-01-01 00:00:00.000 BC'
公元后:'0001-01-01 00:00:00.000'到'9999-12-31 23:59:59.999'
UTC:-12:59到+14:59

示例:

日期时间类型,创建DATETIME类型与DATETIME WITH TIME ZONE字段表,插入数据和查询数据。

sql
SQL> CREATE TABLE tab_datetime_test(col1 DATETIME, col2 DATETIME WITH TIME ZONE);
 
SQL> INSERT INTO tab_datetime_test VALUES('2025-06-20 15:16:25','2025-06-21 17:16:25+08:00');
  
SQL> SELECT * FROM tab_datetime_test;
+--------------------------+---------------------------------+
|           COL1           |              COL2               |
+--------------------------+---------------------------------+
| 2025-06-20 15:16:25.000  | 2025-06-21 17:16:25.000  +08:00 |
+--------------------------+---------------------------------+

时间戳

时间戳类型存储年、月、日、时、分、秒、毫秒、时区(可选),范围与日期时间类型一致,时间戳类型默认插入当前系统时间,可根据需求设置记录变更时自动变更该行数据时间戳。

  • 语法格式
sql
TIMESTAMP[size]
TIMESTAMP[size] WITH TIME ZONE
  • 可选size值用来指定小数位秒的精度,范围为[0,6]。实际精度最大显示三位,0表示小数部分截断,如果省略,则默认精度为3。

下表展示了时间戳类型的字节格式、长度和表示范围:

数据类型格式字节长度范围
TIMESTAMPYYYY-MM-DD HH24:MI:SS8字节公元前:'9999-12-31 23:59:59.999 BC'到'0002-01-01 00:00:00.000 BC'
公元后:'0001-01-01 00:00:00.000'到'9999-12-31 23:59:59.999'
TIMESTAMP WITH TIME ZONEYYYY-MM-DD HH24:MI:SS10字节公元前:'9999-12-31 23:59:59.999 BC'到'0002-01-01 00:00:00.000 BC'
公元后:'0001-01-01 00:00:00.000'到'9999-12-31 23:59:59.999'

提示

  • 表字段类型为时间戳类型时,当不插入数据时,数据库会默认插入当前的时间,而对于日期时间类型不会插入当前时间。

示例:

时间戳类型,创建TIMESTAMP类型与TIMESTAMP WITH TIME ZONE字段表,插入数据和查询数据。

sql
SQL> CREATE TABLE tab_timestamp_test(col1 TIMESTAMP, col2 TIMESTAMP WITH TIME ZONE);
 
SQL> INSERT INTO tab_timestamp_test VALUES('2025-06-20 15:16:25','2025-06-21 17:16:25+08:00');
  
SQL> SELECT * FROM tab_timestamp_test;
+--------------------------+---------------------------------+
|           COL1           |              COL2               |
+--------------------------+---------------------------------+
| 2025-06-20 15:16:25.000  | 2025-06-21 17:16:25.000  +08:00 |
+--------------------------+---------------------------------+

时间间隔类型

时间间隔类型是数据库中专门表示时间长度或时间跨度的数据类型,用于对日期/时间值进行精确的加减运算、计算时间差以及定义时间窗口。

  • 语法格式
sql
INTERVAL YEAR[size]
INTERVAL MONTH[size]
INTERVAL DAY[size]
INTERVAL HOUR[size]
INTERVAL MINUTE[size]
INTERVAL SECOND[size, size]
INTERVAL YEAR[size] TO MONTH
INTERVAL DAY[size] TO HOUR
INTERVAL DAY[size] TO MINUTE
INTERVAL DAY[size] TO SECOND[size]
INTERVAL HOUR[size] TO MINUTE
INTERVAL HOUR[size] TO SECOND[size]
INTERVAL MINUTE[size] TO SECOND[size]

下表展示了时间间隔类型的字节长度、表示范围、SIZE:

数据类型字节长度范围SIZE
INTERVAL YEAR4[-999999999, 999999999][0, 9]
INTERVAL MONTH4[-999999999, 999999999][0, 9]
INTERVAL DAY4[-999999999, 999999999][0, 9]
INTERVAL HOUR4[-999999999, 999999999][0, 9]
INTERVAL MINUTE4[-999999999, 999999999][0, 9]
INTERVAL SECOND8[-999999999.999999, 999999999.999999]1:[0, 9]
2:[0, 6]
INTERVAL YEAR TO MONTH4year:[-99999999, 99999999]
month:[0, 11]
[0, 8]
INTERVAL DAY TO HOUR4day:[-9999999, 9999999]
hour:[0, 23]
[0, 7]
INTERVAL DAY TO MINUTE4day:[-999999, 999999]
hour:[0, 23]
minute[0, 59]
[0, 6]
INTERVAL DAY TO SECOND8day:[-999999, 999999]
hour:[0, 23]
minute[0, 59]
second:[0, 59]
1:[0, 6]
2:[0, 6]
INTERVAL HOUR TO MINUTE4hour:[-9999999, 9999999]
minute:[0, 59]
[0, 7]
INTERVAL HOUR TO SECOND8hour:[-9999999, 9999999]
minute:[0, 59]
second:[0, 59]
1:[0, 7]
2:[0, 6]
INTERVAL MINUTE TO SECOND8minute:[-9999999, 9999999]
second:[0, 59]
1:[0, 7]
2:[0, 6]

提示

  • 对于时间间隔类型不指定SIZE时,默认值取SIZE范围最大值。

示例:

时间间隔类型,创建间隔类型字段表,插入数据和查询数据。

sql
SQL> CREATE TABLE tab_interval_test(col1 INTERVAL YEAR,
                                    col2 INTERVAL MONTH,
                                    col3 INTERVAL DAY,
                                    col4 INTERVAL HOUR,
                                    col5 INTERVAL MINUTE,
                                    col6 INTERVAL SECOND,
                                    col7 INTERVAL YEAR TO MONTH,
                                    col8 INTERVAL DAY TO HOUR,
                                    col9 INTERVAL DAY TO MINUTE,
                                    col10 INTERVAL DAY TO SECOND,
                                    col11 INTERVAL HOUR TO MINUTE,
                                    coll2 INTERVAL HOUR TO SECOND,
                                    col13 INTERVAL MINUTE TO SECOND);
 
SQL> INSERT INTO tab_interval_test VALUES(2025, 1000, 1996, 5200, 12345, 1999.9898, '2025-11', '66666 23', '9999 23:56', '2222:12:56:24.233', '888:26', '9999999:59:59.999999', '9999999:59.999999');
  
SQL> SELECT * FROM tab_interval_test;
+------------+------------+------------+------------+------------+-------------------+--------------+-------------+---------------+-------------------------+-------------+-----------------------+--------------------+
|    COL1    |    COL2    |    COL3    |    COL4    |    COL5    |       COL6        |     COL7     |    COL8     |     COL9      |          COL10          |    COL11    |         COLL2         |       COL13        |
+------------+------------+------------+------------+------------+-------------------+--------------+-------------+---------------+-------------------------+-------------+-----------------------+--------------------+
|       2025 |       1000 |       1996 |       5200 |      12345 |       1999.989800 |      2025-11 |    66666 23 |    9999 23:56 |    2222 12:56:24.233000 |      888:26 |  9999999:59:59.999999 |  9999999:59.999999 |
+------------+------------+------------+------------+------------+-------------------+--------------+-------------+---------------+-------------------------+-------------+-----------------------+--------------------+