#日期型

日期型是时间维度上的数据类型,多用于时间维度上的数据提取和分析。可进一步将类型划分为:

  • 日期时间类型(Date&Time Data Type):表示某个日期或时刻。具体包括日期(DATE)、时间(TIME)、时间戳(TIMESTAMP)三个数据类型。
  • 间隔类型(Interval Data Type):表示两个日期或时刻之间的间隔长度。具体包括年到月间隔(INTERVAL YEAR TO MONTH)、天到秒(INTERVAL DAY TO SECOND)两个数据类型。

# 日期类型(Date Data Type)

日期类型存储了与时区无关的逻辑日历信息,其信息包括年、月、日(时、分、秒)。 可通过set命令来设置date格式。

# 存储属性

类型 字节长度 取值范围 精度
DATE 8 0001-01-01 00:00:00 ~ 9999-12-31 23:59:59

# 数据格式

DATE类型的默认格式为YYYY-MM-DD,也可以按类似YYYY-MM-DD [HH[24]][:MI][:SS]的标准格式进行指定,其中各字符含义为:

  • YYYY:以四位数字表示的年份,取值范围[0001,9999]。
  • MM:以一位或两位数字表示的月份,取值范围[1,12]。
  • DD:以一位或两位数字表示的日期,取值范围[1,31]。
  • HH[24]:以一位或两位数字表示的小时,24表示24小时制,取值范围[0,23]。
  • MI:以一位或两位数字表示的分钟,取值范围[0,59]。
  • SS:以一位或两位数字表示的秒钟,取值范围[0,59]。

示例

CREATE TABLE date_date(C1 DATE);
INSERT INTO date_date VALUES ('2020-01-01');
INSERT INTO date_date VALUES ('2020-1-1');
COMMIT;
  
SELECT C1 FROM date_date;
C1
--------------------------------
2020-01-01 00:00:00
2020-01-01 00:00:00

# 时间类型(Time Data Type)

时间类型表示一日以内的时间,包含时、分、秒和微秒。

# 存储属性

类型 字节长度 取值范围 精度
TIME 8 00:00:00.000000 ~ 23:59:59.999999 微秒

# 数据格式

按类似HH[24][:MI][:SS][.FF] 的标准格式进行指定,其中各字符含义为:

  • HH[24]:以一位或两位数字表示的小时,24表示24小时制,取值范围[0,23]。
  • MI:以一位或两位数字表示的分钟,取值范围[0,59]。
  • SS:以一位或两位数字表示的秒钟,取值范围[0,59]。
  • FF:以一位到六位数字表示的微秒,取值范围[0,999999]。

对TIME类型执行字符串转换时,上面标准格式里的所有部分可以从低位向上省略,省略的部分按0补位。

示例

CREATE TABLE date_time(C1 TIME);
INSERT INTO date_time VALUES ('23:59:59.999999');
INSERT INTO date_time VALUES ('2:5:5');
INSERT INTO date_time VALUES ('1:2');
COMMIT;
   
SELECT C1 FROM date_time ;
C1
--------------------
23:59:59.999999
02:05:05.000000
01:02:00.000000

# 时间戳类型(Timestamp Data Type)

时间戳类型是信息最为全面的日期时间类型,其信息包含了年、月、日、时、分、秒、微秒。

# 存储属性

类型 字节长度 取值范围 精度
TIMESTAMP 8 1-1-1 00:00:00.000000 ~ 9999-12-31 23:59:59.999999 微秒

# 数据格式

按类似YYYY-MM-DD [HH[24]][:MI][:SS][.FF]的标准格式进行指定,其中各字符含义为:

  • YYYY:以四位数字表示的年份,取值范围[0001,9999]。
  • MM:以一位或两位数字表示的月份,取值范围[1,12]。
  • DD:以一位或两位数字表示的日期,取值范围[1,31]。
  • HH[24]:以一位或两位数字表示的小时,24表示24小时制,取值范围[0,23]。
  • MI:以一位或两位数字表示的分钟,取值范围[0,59]。
  • SS:以一位或两位数字表示的秒钟,取值范围[0,59]。
  • FF:以一位到六位数字表示的微秒,取值范围[0,999999]。

Note

微秒的特殊处理:

  • 在数据类型定义时,微秒精度可定义范围为0~9,但输出的实际精度值为6。
  • 系统可以接收0~9位数字的微秒输入,但会将其补齐或四舍五入到6位。

示例

CREATE TABLE date_timestamp (C1 TIMESTAMP);
INSERT INTO date_timestamp VALUES ('2020-01-01 12:30:30.123456');
INSERT INTO date_timestamp VALUES ('2020-1-1 12:30:30.123456');
INSERT INTO date_timestamp VALUES ('2020-1-1');
COMMIT;
  
SELECT C1 FROM date_timestamp;
C1
----------------------------------------------------------------
2020-01-01 12:30:30.123456
2020-01-01 12:30:30.123456
2020-01-01 00:00:00.000000

--可定义最大9的微秒精度,但实际存储精度为6
CREATE TABLE timestamp_test(c1 TIMESTAMP(3));
INSERT INTO timestamp_test VALUES('2012-1-1 1:1:1.123456789');
SELECT c1 res FROM timestamp_test;
RES
----------------------------------------------------------------
2012-01-01 01:01:01.123457

# 年到月间隔类型(Interval Year To Month Data Type)

年到月间隔类型表示以年月为单位的时间间隔。

# 存储属性

类型 字节长度 取值范围 精度
INTERVAL YEAR TO MONTH 4 -178000000-00 ~ 178000000-00

# 定义格式

年到月间隔类型的定义格式为INTERVAL YEAR [(year_precision)] TO MONTH。year_precision:表示年的精度,取值范围[0,9],省略时取默认值2。

Note

00-00特殊处理:

在年精度最大值9以内,和月精度最大值2以内,输入任意个0,都将被视为'00',而不受定义格式里所指定的精度限制。

# 数据格式

YYYY-MM标准格式或INTERVAL 'YYYY' YEAR(MM)指定:

  • YYYY:年份,有效值为-178000000到178000000。
  • MM:月份,有效值为0到11。

示例

CREATE TABLE date_iytm (no INT, c1 INTERVAL YEAR(4) TO MONTH);
INSERT INTO date_iytm VALUES(1,'1000-10');
INSERT INTO date_iytm VALUES(2,'1000-0');
INSERT INTO date_iytm VALUES(3,'000000000-11');
INSERT INTO date_iytm VALUES(4,INTERVAL '1000' YEAR(9));
INSERT INTO date_iytm VALUES(5,INTERVAL '11' MONTH);
COMMIT;
  
SELECT * FROM date_iytm ORDER BY no;
          NO C1            
------------ ---------------
           1 +1000-10     
           2 +1000-00     
           3 +00-11       
           4 +1000-00     
           5 +00-11

# 天到秒间隔类型(Interval Day To Second Data Type)

天到秒间隔类型表示以天、时、分、秒、微秒为单位的时间间隔。

# 存储属性

类型 字节长度 取值范围 精度
INTERVAL DAY TO SECOND 8 -100000000 00:00:00.000000
~ 100000000 00:00:00.000000
微秒

# 定义格式

天到秒间隔类型的定义格式为INTERVAL DAY[(day_precision)] TO SECOND[(fractional_seconds_precision)],其中:

  • day_precision:表示天的精度,语法支持[0,9],实际取值范围[0,8]。
  • fractional_seconds_precision:表示微秒的精度,取值范围[0,9]。

(day_precision)省略时,系统取默认值2;(fractional_seconds_precision)省略时,系统取默认值6。

# 数据格式

该类型的标准格式为DD HH:MI:SS[.FF]INTERVAL 'DD' DAY(day_precision)INTERVAL 'HH' HOUR或INTERVAL 'MI:SS.DDDDDD' MINUTE TO SECOND(fractional_seconds_precision),各字符含义为:

  • DD:日期,取值范围[-100000000,100000000 ]。
  • HH:小时,取值范围[0,23 ]。
  • MI:分钟,取值范围[0,59 ]。
  • SS:秒钟,取值范围[0,59 ]。
  • FF:微秒,取值范围[0,999999 ]。

Note

微秒的特殊处理:

  • 在数据类型定义时,微秒精度可定义范围为0~9,但输出的实际精度值为6。
  • 系统可以接收0~9位数字的微秒输入,但会将其补齐或四舍五入到定义的精度(定义的精度大于6时按6处理)。

示例

CREATE TABLE date_idts(no INT, c1 INTERVAL DAY(9) TO SECOND(9));
INSERT INTO date_idts VALUES(1,'50 10:30:59.999999');
INSERT INTO date_idts VALUES(2,'50 00:00:59.999999');
INSERT INTO date_idts VALUES(3,'00 10:30:00.000000');
INSERT INTO date_idts VALUES(4,'50 00:00:00.000000');
INSERT INTO date_idts VALUES(5,INTERVAL '50' DAY(6));
INSERT INTO date_idts VALUES(6,INTERVAL '10' HOUR);
INSERT INTO date_idts VALUES(7,INTERVAL '30:59.9' MINUTE TO SECOND(6));
INSERT INTO date_idts VALUES(8,INTERVAL '30:59.9999999' MINUTE TO SECOND(6));
INSERT INTO date_idts VALUES(9,INTERVAL '30:59.9999990' MINUTE TO SECOND(6));
INSERT INTO date_idts VALUES(10,INTERVAL '30:59.9999990' MINUTE TO SECOND(3));
INSERT INTO date_idts VALUES(11,INTERVAL '30:59.999999567' MINUTE TO SECOND(8));
COMMIT;
   
SELECT * FROM date_idts ORDER BY no;
          NO C1                             
------------ --------------------------------
           1 +50 10:30:59.999999           
           2 +50 00:00:59.999999           
           3 +00 10:30:00.000000           
           4 +50 00:00:00.000000           
           5 +50 00:00:00.000000           
           6 +00 10:00:00.000000           
           7 +00 00:30:59.900000           
           8 +00 00:31:00.000000           
           9 +00 00:30:59.999999           
          10 +00 00:31:00.000000             
          11 +00 00:31:00.000000