更新时间:2026-10-21 GMT+08:00
分享

日期/时间类型

GaussDB支持的日期/时间类型请参见表1。该类型的操作符和内置函数请参见时间和日期处理函数和操作符。

  • 如果其他的数据库时间格式和GaussDB的时间格式不一致,可通过修改配置参数DateStyle的值来保持一致。
  • 当前日期表示法采用ISO标准,年由4位数组成,以公历公元1年为0001年,以公元前1年为0000年,公元前2年为-0001年,其他以此类推。
  • 在ORA兼容性下,DATE类型在GUC参数mapping_date_to_datea取值为off时,使用TIMESTAMP(0) WITHOUT TIME ZONE代替,而该GUC参数取值为on时,使用DATEA类型代替。两类型间主要差异总结如下:
    • DATEA类型和TIMESTAMP(0)类型的OID不同,DATEA类型为GaussDB内部实现的一套全新数据类型,有对应配套的操作符、转换函数等。
    • DATEA类型和TIMESTAMP(0)类型支持的范围不同。
    • 输入DATEA类型时,需要对字符串进行格式化校验,只有满足nls_date_format格式才可以转换为DATEA类型,而TIMESTAMP(0)类型则仅支持几种固定格式的输入。DATEA类型不支持特殊值输入,如:NOW、EPOCH、TODAY等。
    • 在驱动使用方面,TIMESTAMP(0)类型的元数据(包含OID、语言数据类型等)和DATEA类型的元数据不同。在JDBC中设置预编译参数时,对于TIMESTAMP(0)类型,需要使用SetTimestamp或者GetTimestamp;对于DATEA类型,则需要使用SetDate或者GetDate。
    • 在COPY导入数据时,可以设置WITH选项,设置导入数据时按照何种格式解析。对于TIMESTAMP(0)类型,需要使用TIMESTAMP_FORMAT指定;对于DATEA类型,则需要使用DATEA_FORMAT指定。具体请参见语法格式。
表1 日期/时间类型

名称

描述

存储空间

DATE

日期和时间。

最小值:公元前4713年,4714-11-24 BC。最大值:公元5874897年,5874897-12-31AD。

在设置sql_compatibility = 'MYSQL'、b_format_version = '5.7'和b_format_dev_version = 's1'三个参数后,输入和输出格式、范围的规格有差异:

  • 输入格式:支持有分隔符YYYY-MM-DD和无分隔符YYYYMMDD的输入格式。
    • 有分隔符场景下,日期的年、月、日之间不支持“+”、“:”作为分隔符(某些分隔符混合使用场景下不支持,规格继承已有实现。如:date '2020-12?12'),输入格式不受DateStyle参数的影响。
    • 无分隔符场景下,输入不完整时可能不会报错,但是输出结果不一定正确。
  • 输出格式:仅支持YYYY-MM-DD,且不受DateStyle参数的影响。
  • 范围:4713-01-01 BC ~ 5874897-12-31 AD。
    • sql_mode参数值包含“strict_trans_tables”时,非法输入或者超过范围,会报错。
    • sql_mode参数值不包含“strict_trans_tables”时,允许年、月、日值是0,但是输出时会按照年、月、日的顺序依次转换为合法的值,如'0000-00-10' 转换为:0002-12-10 BC。 非法输入或者超过范围时,会报warning信息,并返回0000-00-00 00:00:00值。
说明:

ORA兼容性下,mapping_date_to_datea开关关闭时,数据类型DATE会被替换为TIMESTAMP(0) WITHOUT TIME ZONE。

ORA兼容性下,mapping_date_to_datea开关打开时,数据类型DATE会被替换为DATEA。

4字节(兼容模式ORA下存储空间大小为8字节)

TIME [(p)] [WITHOUT TIME ZONE]

用于表示一天内的时间,不带时区。

p表示小数点后的精度,取值范围为0~6。

最小值:00:00:00。最大值:24:00:00。

在设置sql_compatibility = 'MYSQL'、b_format_version = '5.7'和b_format_dev_version = 's1'三个参数后,不限定于表示一天内的时间,如可以表示持续时间、相对时间等概念,且格式、范围、精度的规格有差异:

  • 输入格式:支持有分隔符[D] hh:mi:ss.ff和无分隔符 hhmiss.ff的输入格式。D是表示天数,整型数(支持负数),可选。输出时会按照1天24小时的关系换算成小时数,加hh后显示。只支持冒号“:”作为分隔符。
  • 输出格式:hh:mi:ss.ff。在显示的时候会自动忽略小数部分末尾的所有零。
  • 范围:-838:59:59.000000 ~ 838:59:59.000000。
    • sql_mode参数值包含“strict_trans_tables”时,非法输入返回00:00:00,超过范围会报错。
    • sql_mode参数值不包含“strict_trans_tables”时,非法输入会返回 00:00:00;合法输入但是超过范围,会返回最近的边界值。如:838:59:59.000001会返回 838:59:59,而-838:59:59.000001会返回-838:59:59。
  • 精度:p表示小数点后的精度,取值范围为0~6。当p设置超过6时,按照p为6进行处理。
    • 作为表列的数据类型时,缺省精度为0。
    • 作为表达式使用(如time '10:10:10.123456')时,缺省的精度为6。

8字节

TIME [(p)] [WITH TIME ZONE]

用于表示一天内的时间,携带时区。

p表示小数点后的精度,取值范围为0~6。

最小值:00:00:00+15:59。最大值:24:00:00-15:59。

12字节

TIMESTAMP[(p)] [WITHOUT TIME ZONE]

日期和时间,不携带时区。

p表示小数点后的精度,取值范围为0~6。

最小值:公元前4713年,4714-11-24 BC 00:00:00.000000。最大值:公元294277年,294277-01-09 AD 04:00:54.775807,最大值等效infinity。

在设置sql_compatibility = 'MYSQL'、b_format_version = '5.7'和b_format_dev_version = 's1'三个参数后,会被替换为TIMESTAMP[(p)] [WITH TIME ZONE]类型,但格式、范围、精度的规格有差异:

  • 输入格式:支持有分隔符YYYY-MM-DD hh:mi:ss.ff+timezone和无分隔符YYYYMMDDhhmiss.ff的输入格式。
    • 有分隔符的情况下,日期年、月、日之间不支持“+”、“:”作为分隔符(某些分隔符混合使用场景下不支持,规格继承已有实现。如:timestamp '2020-12?12 00:00:00'),时间部分只支持冒号“:”作为分隔符。输入格式不受DateStyle参数的影响。
    • 无分隔符且输入不完整的场景下,可能不会报错,但是输出结果不一定正确。
    • 年份只有2位数时,00~69对应范围为2000~2069;70~99对应范围为1970~1999。
    • 年份只有1位数时,如:timestamp '1-1-1 00:00:00' 结果为'0001-01-01 00:00:00'。
  • 输出格式:仅支持YYYY-MM-DD hh:mi:ss.ff格式,且不受DateStyle参数的影响。在显示的时候会自动忽略时间部分小数部分末尾的所有零。
  • 范围:
    • sql_mode参数值包含“strict_trans_tables”时,范围与TIMESTAMP[(p)] WITH TIME ZONE一致;非法输入或者超过范围时,会报错。
    • sql_mode参数值不包含“strict_trans_tables”时,允许年、月、日值是0,但是输出时会按照年、月、日的顺序依次转换为合法的值,如'0000-00-10 00:00:00'转换为:0002-12-10 00:00:00 BC。 非法输入或者超过范围时,会报warning信息,并返回0000-00-00 00:00:00值。
  • 精度:p表示小数点后的精度,取值范围为0~6。当p设置超过6时,按照p为6进行处理。
    • 作为表列的数据类型时,缺省精度为0。
    • 作为表达式使用(如timestamp '2000-01-01 00:00:00.123456')时,缺省的精度为6。
  • 时区:支持的范围:-15:59~+15:59,或使用时区名称(请参考系统视图PG_TIMEZONE_NAMES),与TIMESTAMP[(p)] WITH TIME ZONE类型的时区规格一致。将指定时区的时间值转换为UTC-0时区的时间。显示时,再将UTC-0时区的时间转换为当前服务器时区(SHOW TIME ZONE可以查看服务器时区)的时间。因此,通过SET TIME ZONE语句更改服务器时区时,显示的结果也会变更。

8字节

TIMESTAMP[(p)][WITH TIME ZONE]

日期和时间,带时区。TIMESTAMP的别名为TIMESTAMPTZ。

p表示小数点后的精度,取值范围为0~6。

最小值:公元前4713年,4714-11-24 BC 00:00:00.000000 +0。最大值:公元294277年,294277-01-09 AD 04:00:54.775807 +0,最大值等效infinity。需要注意的是,输入的原始日期时间、将其转换成UTC-0时区的日期时间以及转换成当前服务器时区的日期时间,三者均不能大于294277-01-09 AD 04:00:54.775807或小于4714-11-24 BC 00:00:00.000000,否则在使用过程中有可能出现日期时间超出范围的报错。

时区更新:部分国家或地区因为政治、经济、战争等因素经常会更新时区信息,数据库系统也因此需要同步修改时区文件以确保时间内容的正确性。

GaussDB时区类型目前只涉及timestamp with timezone,当新的时区文件生效时,不会对已有的数据进行变更,新数据会随时区文件信息进行同步调整。

8字节

SMALLDATETIME

日期和时间,不带时区。

精确到分钟,秒位大于等于30秒进一位。

最小值:公元前4713年,4714-11-24 BC 00:00:00。最大值:公元294277年,294277-01-09 AD 04:00:00。

8字节

INTERVAL DAY (l) TO SECOND (p)

时间间隔,X天X小时X分X秒。

  • l:天数的精度,取值范围为0~6。兼容性考虑,目前未实现具体功能。
  • p:秒数的精度,取值范围为0~6。小数末尾的零不显示。

16字节

INTERVAL [FIELDS] [ (p) ]

时间间隔。

  • FIELDS:可以是YEAR,MONTH,DAY,HOUR,MINUTE,SECOND,DAY TO HOUR,DAY TO MINUTE,DAY TO SECOND,HOUR TO MINUTE,HOUR TO SECOND,MINUTE TO SECOND。
  • p:秒数的精度,取值范围为0~6,且fields为SECOND,DAY TO SECOND,HOUR TO SECOND或MINUTE TO SECOND时,参数p才有效。小数末尾的零不显示。

12字节

reltime

相对时间间隔。

  • 格式为:X years X mons X days XX:XX:XX。
  • 采用儒略历计时,规定一年为365.25天,一个月为30天,计算输入值对应的相对时间间隔。

4字节

abstime

日期和时间。

  • 格式为:YYYY-MM-DD hh:mi:ss+timezone。
  • 取值范围为当前时区的1901-12-13 20:45:53~2038-01-18 23:59:59,精度为秒。插入超出范围的数据会转换为invalid特殊值存储。

4字节

datetime[(p)]

日期和时间。

仅在设置sql_compatibility = 'MYSQL'、b_format_version = '5.7'以及b_format_dev_version = 's1'三个参数后生效,datetime[(p)]类型会被替换为TIMESTAMP[(p)] WITHOUT TIME ZONE类型,但格式、范围、精度、时区处理的规格有差异:

  • 输入格式:支持有分隔符YYYY-MM-DD hh:mi:ss.ff+timezone和无分隔符YYYYMMDDhhmiss.ff的输入格式。
    • 有分隔符的情况下,日期年、月、日之间不支持“+”、“:”作为分隔符(某些分隔符混合使用场景下不支持,规格继承已有实现。如:datetime '2020-12?12 00:00:00'),时间部分只支持冒号“:”作为分隔符。输入格式不受DateStyle参数的影响。
    • 无分隔符且输入不完整的场景下,可能不会报错,但是输出结果不一定正确。
    • 年份只有2位数时,00-69对应范围为2000-2069;70-99对应范围为:1970-1999。
    • 年份只有1位数时,如:datetime '1-1-1 00:00:00' 结果为'0001-01-01 00:00:00'。
  • 输出格式:仅支持YYYY-MM-DD hh:mi:ss.ff格式,且不受DateStyle参数的影响。在显示的时候会自动忽略时间部分小数部分末尾的所有零。
  • 范围:
    • sql_mode参数值包含“strict_trans_tables”时,范围与TIMESTAMP[(p)] WITHOUT TIME ZONE一致,非法输入或者超过范围时,会报错。
    • sql_mode参数值不包含“strict_trans_tables”时,允许年、月、日值是0,但是输出时会按照年、月、日的顺序依次转换为合法的值,如'0000-00-10 00:00:00'转换为:0002-12-10 00:00:00 BC。非法输入或者超过范围时,会报warning信息,并返回0000-00-00 00:00:00值。
  • 精度:p表示小数点后的精度,取值范围为0~6。给定精度超过6时,按照6处理。
    • 作为表列的数据类型时,缺省精度为0。
    • 作为表达式使用(如:datetime '2000-01-01 00:00:00.123456')时,缺省的精度为6。
  • 时区:支持的范围:-15:59 ~ +15:59,或使用时区名称(请参考系统视图PG_TIMEZONE_NAMES),与TIMESTAMP[(p)] WITH TIME ZONE类型的时区规格一致。将指定时区的时间值转换为当前服务器时区(SHOW TIME ZONE可以查看服务器时区)的时间。如果将转换后的日期时间存入表中,此值不会再随服务器时区的变更而再做时区转换。

8字节

year[(w)]

年份。

仅在设置sql_compatibility = 'MYSQL'参数后生效。

  • 输入格式:
    • 4位纯数字字符串:'1901'~'2155',表示从1901年到2155年。
    • 4位数字:1901~2155,表示从1901年到2155年。
    • 1位或者2位的纯数字字符串:'0'~'99',其中,'0'~'69'表示从2000年到2069年,'70'~'99'表示为从1970年到1999年。'0'、'00'表示为2000年。
    • 1位或者2位的数字:0~99,其中,1~69表示从2001年到2069年,70~99表示为从1970年到1999年。0表示为0000。
    • 其他时间函数的返回值,如now()。
  • 输出格式:仅支持YYYY格式。w表示输出格式的位数,只支持4位。若不指定,默认为4位。
  • 范围:1901~2155。
    • sql_mode参数值包含“strict_trans_tables”时,非法输入或者超过范围,会报错。
    • sql_mode参数值不包含“strict_trans_tables”时,会将非法值转为0000插入,并提示告警。

1字节

DATEA

日期和时间。

仅在设置sql_compatibility = 'ORA'参数后生效。

最小值:公元前4712年1月1日0时0分0秒。

最大值:公元9999年12月31日23时59分59秒。

输入格式:输入格式必须符合参数nls_date_format设置的时间格式,nls_date_format支持的格式请参考表2。
  • 支持'-'、'/'、','、'.'、'%'、':'或用""包含的字符串作为分隔符。
  • 无分隔符且输入不完整的场景下,可能不会报错,但是输出结果不一定正确。
  • 若输入格式包含YY时,DATEA优先尝试两位年份解析,失败后尝试四位年份解析,最终错误信息以四位年份解析失败返回的信息为准。

输出格式:仅支持YYYY-MM-DD HH24:MI:SS AD/BC的时间格式,且不受DateStyle参数的影响。

范围:公元前4712年1月1日0时0分0秒 ~ 公元9999年12月31日23时59分59秒, 非法输入或输入超过范围,会报错。

精度:不保留小数点后精度,最小精度为秒。

说明:
  • 在ORA兼容性下,mapping_date_to_datea开关开启时,用于替换DATE类型。
  • DATEA类型用于内部功能实现,不建议用户直接使用。
  • DATEA类型不支持作为自定义range类型。
  • 输入格式若不满足nls_date_format设置的时间格式可能产生以下结果:
    • 出现报错提示,提示输入的格式不符合要求。
    • 输入成功,但输入的时间与预期结果不符。

8字节

  • 时间类型的数据在显示的时候会自动忽略末尾的所有零。
  • 精度p默认取值为6。
  • 对于INTERVAL类型,日期和时间在系统内部分别用int32和double类型存储,所以两者的取值范围和对应数据类型的取值范围一致。
  • 插入时间超出范围的时候,系统可能不报错,但不保证行为正常。
  • 在参数a_format_version值为10c和a_format_dev_version值为s1的情况下,缺省的DATE值由以下确定:
    • 年通过SYSDATE返回当年。
    • 月通过SYSDATE返回当月。
    • 日返回01(月份的第一天)。
    • 小时,分钟,秒都是0。

示例:

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
--创建表。
gaussdb=# CREATE TABLE date_type_tab(coll date);

--插入数据。
gaussdb=# INSERT INTO date_type_tab VALUES (date '12-10-2010');

--查看数据。
gaussdb=# SELECT * FROM date_type_tab;
    coll
------------
  2010-12-10
(1 row)

--删除表。
gaussdb=# DROP TABLE date_type_tab;

--创建表。
gaussdb=# CREATE TABLE time_type_tab (da time without time zone ,dai time with time zone,dfgh timestamp without time zone,dfga timestamp with time zone, vbg smalldatetime);

--插入数据。
gaussdb=# INSERT INTO time_type_tab VALUES ('21:21:21','21:21:21 pst','2010-12-12','2013-12-11 pst','2003-04-12 04:05:06');

--查看数据。
gaussdb=# SELECT * FROM time_type_tab;
    da    |     dai     |        dfgh         |          dfga          |         vbg         
----------+-------------+---------------------+------------------------+---------------------
 21:21:21 | 21:21:21-08 | 2010-12-12 00:00:00 | 2013-12-11 16:00:00+08 | 2003-04-12 04:05:00
(1 row)

--删除表。
gaussdb=# DROP TABLE time_type_tab;

--创建表。
gaussdb=# CREATE TABLE day_type_tab (a int,b INTERVAL DAY(3) TO SECOND (4)); 

--插入数据。
gaussdb=# INSERT INTO day_type_tab VALUES (1, INTERVAL '3' DAY);

--查看数据。
gaussdb=# SELECT * FROM day_type_tab;
 a |   b    
---+--------
 1 | 3 days
(1 row)

--删除表。
gaussdb=# DROP TABLE day_type_tab;

--创建表。
gaussdb=# CREATE TABLE year_type_tab(a int, b interval year (6));

--插入数据。
gaussdb=# INSERT INTO year_type_tab VALUES(1,interval '2' year);

--查看数据。
gaussdb=# SELECT * FROM year_type_tab;
 a |    b    
---+---------
 1 | 2 years
(1 row)

gaussdb=# SELECT TIME 'allballs';
   time
----------
 00:00:00
(1 row)

--删除表。
gaussdb=# DROP TABLE year_type_tab;

-- ORA兼容模式下,当mapping_date_to_datea=on时,datea数据类型示例。
-- 创建ORA兼容模式下的数据库。
gaussdb=# CREATE DATABASE ora_db DBCOMPATIBILITY = 'ORA';
CREATE DATABASE

-- 切换到ORA兼容模式下的数据库。
gaussdb=# \c ora_db

-- 查看参数mapping_date_to_datea。
ora_db=# SHOW mapping_date_to_datea;
 mapping_date_to_datea 
-----------------------
 on
(1 row)

-- 创建表。
ora_db=# CREATE TABLE datea_type_tab(a int, b date);

-- 设置nls_date_format参数。
ora_db=# SET nls_date_format='YYMMDD HH:MI:SS';
SET

-- 插入数据。
ora_db=# INSERT INTO datea_type_tab VALUES(1, '20210512 05:52:23'::date); --YY按照4位年份解析。
INSERT 0 1
ora_db=# INSERT INTO datea_type_tab VALUES(2, '201012 11:12:13'::date); --YY按照2位年份解析。
INSERT 0 1

ora_db=# INSERT INTO datea_type_tab VALUES(3, '251126 00:00:00'::date); --最终错误信息来自YY按照四位年份解析失败时产生的信息。
ERROR:  The data of "month = 26" is invalid. The value must be between 1 and 12.
LINE 1: INSERT INTO datea_type_tab VALUES(3, '251126 00:00:00'::date...
                                             ^
-- 查看数据。
ora_db=# SELECT * FROM datea_type_tab ORDER BY a;
 a |           b            
---+------------------------
 1 | 2021-05-12 05:52:23 AD
 2 | 2020-10-12 11:12:13 AD
(2 rows)

-- 删除表。
ora_db=# DROP TABLE datea_type_tab;
ora_db=# \c postgres

-- 删除数据库。
gaussdb=# DROP DATABASE ora_db;
DROP DATABASE

-- MYSQL兼容模式下datetime和timestamp数据类型示例。
-- 创建MYSQL兼容模式下的数据库。
-- 切换到MYSQL兼容模式下的数据库。
gaussdb=# CREATE DATABASE gaussdb_m dbcompatibility='MYSQL';
gaussdb=# \c gaussdb_m;

-- 设置兼容版本控制参数。
gaussdb_m=# SET b_format_version = '5.7';
gaussdb_m=# SET b_format_dev_version = 's1';

-- 创建表。
gaussdb_m=# CREATE TABLE datetime_typ_tab(col1 datetime, col2 timestamp);

-- 插入数据。
gaussdb_m=# INSERT INTO datetime_typ_tab VALUES ('2003-04-12 04:05:06+09:00', '2003-04-12 04:05:06+09:00');

-- 查看数据。
gaussdb_m=# SELECT * FROM datetime_typ_tab;
        col1         |        col2         
---------------------+---------------------
 2003-04-12 03:05:06 | 2003-04-12 03:05:06
(1 row)

-- 删除表。
gaussdb_m=# DROP TABLE datetime_typ_tab;

-- 创建表。
gaussdb_m=# CREATE TABLE year_typ_tab(col1 year, col2 year(4));

-- 插入数据。
gaussdb_m=# INSERT INTO year_typ_tab VALUES ('2023', now());

-- 查看数据。
gaussdb_m=# SELECT * FROM year_typ_tab;
 col1 | col2 
------+------
 2023 | 2023
(1 row)

-- 删除表和数据库。
gaussdb_m=# DROP TABLE year_typ_tab;
gaussdb_m=# \c postgres;
gaussdb=# DROP DATABASE gaussdb_m;

-- 重置参数。
gaussdb=# RESET ALL;
表2 nls_date_format支持的格式

格式

描述

A.D.

公元后。

AD

公元后。

A.M.

上午。

AM

上午。

B.C.

公元前。

BC

公元前。

CC

世纪(2位),21世纪从2001-01-01开始。

DAY

全长大写日期名(空白填充为9字符)。

DL

返回指定长日期形式。

DS

返回指定短日期。

DDD

一年里的日数(001~366)。

DD

一个月里的日数(01~31)。

DY

缩写大写日期名(3字符)。

D

一周里的日数(1~7;周日是1)。

FX

强制函数严格按照指定的格式解析或格式化日期。

HH24

一天的小时数(00~23)。

HH12

一天的小时数(01~12)。

HH

一天的小时数(01~12)。

IW

ISO一年里的周数(第一个星期四在第一周里)。

IYYY

ISO年(4位或更多位)。

IYY

ISO年的最后三位。

IY

ISO年的最后两位。

I

ISO年的最后一位。

J

儒略日(自公元前4713年1月1日以后的天数)。

MI

分钟(00~59)。

MM

月份数(01~12)。

MONTH

全长大写月份名(空白填充为9字符)。

MON

大写缩写月份名(3字符)。

P.M.

下午。

PM

下午。

Q

季度。

RM

罗马数字的月份(I~XII,其中I=JAN)(大写)。

RRRR

返回日期的4位年份。

RR

返回日期的2位年份。

SSSSS

午夜后的秒(0~86399)。

SCC

世纪,公元前。

SS

秒(00~59)。

SYEAR

返回字符型年,公元前会显示-。

SYYYY

返回数字型年,公元前会显示-。

TS

返回指定时间格式。

WW

一年里的周数(1~53)(第一周从该年的第一天开始)。

W

一个月里的周数(1~5)(第一周从该月第一天开始)。

Y,YYY

带逗号的年(4和更多位)。

YEAR

返回字符型年。

YYYY

年(4和更多位)。

YYY

年的后三位。

YY

年的后两位。

Y

年的最后一位。

GaussDB中,nls_date_format参数值支持使用TH后缀,该后缀的作用是在解析输入的时间字符串时,跳过格式指定部分的两个字节。支持TH后缀的格式包括:HH、HH12、HH24、MI、SS、SSSSS、MM、DDD、DD、D、Y,YYY、YYYY、YYY、YY、Y、RRRR、RR、J、SYYYY。当nls_date_format参数值中包含TH后缀且其不处于字符串末尾时,输入的时间需要预留两个字节,否则会解析错误或者结果异常。例如:

  • 正常解析。
    gaussdb=# select to_datea('2000TH-10-24', 'YYYYTH-MM-DD');   -- 当TH位于YYYY格式后,输入的2000年份后需预留两个字节(可为任意字符)。
    to_datea
    ------------------------
    2000-10-24 00:00:00 AD
    (1 row)
    
    gaussdb=# select to_datea('2000TH-10-24', 'YYYYTH-MM-DDTH');   -- 当TH位于nls_date_format参数末尾,可正常解析。
            to_datea        
    ------------------------
     2000-10-24 00:00:00 AD
    (1 row)
  • 解析错误。
    gaussdb=# select to_datea('2000-10-24', 'YYYYTH-MM-DD');
    ERROR:  The data of "month = 0" is invalid. The value must be between 1 and 12.
    CONTEXT:  referenced column: to_datea
  • 结果异常。
    gaussdb=# select to_datea('2000-11-24', 'YYYYTH-MM-DD');   -- 当TH位于YYYY格式后,由于输入的2000年份后未预留2个字节,解析时将“-1”跳过,MM解析为1月,结果异常。
            to_datea        
    ------------------------
     2000-01-24 00:00:00 AD
    (1 row)

日期输入

日期和时间的输入几乎可以是任何合理的格式,包括ISO-8601格式、SQL-兼容格式或者其它的格式。系统支持按照日、月、年的顺序自定义日期输入。如果把DateStyle参数设置为MDY就按照“月-日-年”解析,设置为DMY就按照“日-月-年”解析,设置为YMD就按照“年-月-日”解析。

日期的文本输入需要加单引号包围,语法如下:

type [ ( p ) ] 'value'

可选的精度声明中的p是一个整数,表示在秒域中小数部分的位数。表3显示了date类型的输入格式。

表3 日期输入格式

例子

描述

1999-01-08

ISO 8601格式(建议格式),任何方式下都是1999年1月8日。

January 8, 1999

在任何datestyle输入模式下都无歧义。

1/8/1999

有歧义,在MDY模式下是1月8日,在DMY模式下是8月1日。

1/18/1999

MDY模式下是1月18日,其它模式下被拒绝。

01/02/03

  • MDY模式下的2003年1月2日。
  • DMY模式下的2003年2月1日。
  • YMD模式下的2001年2月3日。

1999-Jan-08

任何模式下都是1月8日。

Jan-08-1999

任何模式下都是1月8日。

08-Jan-1999

任何模式下都是1月8日。

99-Jan-08

YMD模式下是1月8日,否则错误。

08-Jan-99

1月8日,除了在YMD模式下是错误的之外。

Jan-08-99

1月8日,除了在YMD模式下是错误的之外。

19990108

ISO 8601格式,任何模式下都是1999年1月8日。

990108

ISO 8601格式,任何模式下都是1999年1月8日。

1999.008

年和年里的第几天。

J2451187

儒略日。

January 8, 99 BC

公元前99年。

示例:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
--创建表。
gaussdb=# CREATE TABLE date_type_tab(coll date);

--插入数据。
gaussdb=# INSERT INTO date_type_tab VALUES (date '12-10-2010');

--查看数据。
gaussdb=# SELECT * FROM date_type_tab;
        coll         
---------------------
 2010-12-10
(1 row)

--查看日期格式。
gaussdb=# SHOW datestyle;
 DateStyle 
-----------
 ISO, MDY
(1 row)

--设置日期格式。
gaussdb=# SET datestyle='YMD';
SET

--插入数据。
gaussdb=# INSERT INTO date_type_tab VALUES(date '2010-12-11');

--查看数据。
gaussdb=# SELECT * FROM date_type_tab;
        coll         
---------------------
 2010-12-10
 2010-12-11
(2 rows)

--删除表。
gaussdb=# DROP TABLE date_type_tab;

时间

时间类型包括time [ (p) ] without time zone和time [ (p) ] with time zone。如果只写time等效于time without time zone。

如果在time without time zone类型的输入中声明了时区,则会忽略这个时区。

时间输入类型的详细信息请参见表4,时区输入类型的详细信息请参见表5。

表4 时间输入

例子

描述

05:06.8

ISO 8601

4:05:06

ISO 8601

4:05

ISO 8601

040506

ISO 8601

4:05 AM

与04:05一样,输入小时数必须<= 12。

4:05 PM

与16:05一样,输入小时数必须<= 12。

04:05:06.789-8

ISO 8601

04:05:06-08:00

ISO 8601

04:05-08:00

ISO 8601

040506-08

ISO 8601

04:05:06 PST

缩写的时区。

2003-04-12 04:05:06 America/New_York

用名称声明的时区。

表5 时区输入

例子

描述

PST

太平洋标准时间(Pacific Standard Time)。

America/New_York

完整时区名称。

-8:00

ISO 8601与PST的偏移。

-800

ISO 8601与PST的偏移。

-8

ISO 8601与PST的偏移。

示例:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
gaussdb=# SELECT time '04:05:06';
   time   
----------
 04:05:06
(1 row)

gaussdb=# SELECT time '04:05:06 PST';
   time   
----------
 04:05:06
(1 row)

gaussdb=# SELECT time with time zone '04:05:06 PST';
   timetz    
-------------
 04:05:06-08
(1 row)

特殊值

GaussDB支持几个特殊值,在读取的时候将被转换成普通的日期/时间值,请参考表6。

表6 特殊值

输入字符串

适用类型

描述

epoch

date,timestamp

1970-01-01 00:00:00+00 (Unix系统零时)。

infinity

timestamp

无穷大,比任何其他时间戳都晚。

-infinity

timestamp

无穷小,比任何其他时间戳都早。

now

date,time,timestamp

当前事务的开始时间。

today

date,timestamp

今日午夜零时。

tomorrow

date,timestamp

明日午夜零时。

yesterday

date,timestamp

昨日午夜零时。

allballs

time

00:00:00.00 UTC

示例:

--创建表。
gaussdb=# CREATE TABLE realtime_type_special(col1 varchar(20), col2 date, col3 timestamp, col4 time);

--插入数据。
gaussdb=# INSERT INTO realtime_type_special VALUES('epoch', 'epoch', 'epoch', NULL);
gaussdb=# INSERT INTO realtime_type_special VALUES('now', 'now', 'now', 'now');
gaussdb=# INSERT INTO realtime_type_special VALUES('today', 'today', 'today', NULL);
gaussdb=# INSERT INTO realtime_type_special VALUES('tomorrow', 'tomorrow', 'tomorrow', NULL);
gaussdb=# INSERT INTO realtime_type_special VALUES('yesterday', 'yesterday', 'yesterday', NULL);

--查看数据。
gaussdb=# SELECT * FROM realtime_type_special;
   col1    |        col2         |            col3            |      col4
-----------+---------------------+----------------------------+-----------------
 epoch     | 1970-01-01 00:00:00 | 1970-01-01 00:00:00        |
 now       | 2023-02-27 11:38:13 | 2023-02-27 11:38:13.032815 | 11:38:13.032815
 today     | 2023-02-27 00:00:00 | 2023-02-27 00:00:00        |
 tomorrow  | 2023-02-28 00:00:00 | 2023-02-28 00:00:00        |
 yesterday | 2023-02-26 00:00:00 | 2023-02-26 00:00:00        |
(5 rows)

gaussdb=# SELECT * FROM realtime_type_special WHERE col3 < 'infinity';
   col1    |        col2         |            col3            |      col4
-----------+---------------------+----------------------------+-----------------
 epoch     | 1970-01-01 00:00:00 | 1970-01-01 00:00:00        |
 now       | 2023-02-27 11:38:13 | 2023-02-27 11:38:13.032815 | 11:38:13.032815
 today     | 2023-02-27 00:00:00 | 2023-02-27 00:00:00        |
 tomorrow  | 2023-02-28 00:00:00 | 2023-02-28 00:00:00        |
 yesterday | 2023-02-26 00:00:00 | 2023-02-26 00:00:00        |
(5 rows)

gaussdb=# SELECT * FROM realtime_type_special WHERE col3 > '-infinity';
   col1    |        col2         |            col3            |      col4
-----------+---------------------+----------------------------+-----------------
 epoch     | 1970-01-01 00:00:00 | 1970-01-01 00:00:00        |
 now       | 2023-02-27 11:38:13 | 2023-02-27 11:38:13.032815 | 11:38:13.032815
 today     | 2023-02-27 00:00:00 | 2023-02-27 00:00:00        |
 tomorrow  | 2023-02-28 00:00:00 | 2023-02-28 00:00:00        |
 yesterday | 2023-02-26 00:00:00 | 2023-02-26 00:00:00        |
(5 rows)

gaussdb=# SELECT * FROM realtime_type_special WHERE col3 > 'now';
   col1   |        col2         |        col3         | col4
----------+---------------------+---------------------+------
 tomorrow | 2023-02-28 00:00:00 | 2023-02-28 00:00:00 |
(1 row)

gaussdb=# SELECT * FROM realtime_type_special WHERE col3 = 'today';
 col1  |        col2         |        col3         | col4
-------+---------------------+---------------------+------
 today | 2023-02-27 00:00:00 | 2023-02-27 00:00:00 |
(1 row)

gaussdb=# SELECT * FROM realtime_type_special WHERE col3 = 'tomorrow';
   col1   |        col2         |        col3         | col4
----------+---------------------+---------------------+------
 tomorrow | 2023-02-28 00:00:00 | 2023-02-28 00:00:00 |
(1 row)

gaussdb=# SELECT * FROM realtime_type_special WHERE col3 > 'yesterday';
   col1   |        col2         |            col3            |      col4
----------+---------------------+----------------------------+-----------------
 now      | 2023-02-27 11:38:13 | 2023-02-27 11:38:13.032815 | 11:38:13.032815
 today    | 2023-02-27 00:00:00 | 2023-02-27 00:00:00        |
 tomorrow | 2023-02-28 00:00:00 | 2023-02-28 00:00:00        |
(3 rows)

--删除表。
gaussdb=# DROP TABLE realtime_type_special;

时间段输入

reltime的输入方式可以采用任何合法的时间段文本格式,包括数字形式(含负数和小数)及时间形式,其中时间形式的输入支持SQL标准格式、ISO-8601格式等。另外,文本输入需要加单引号。

时间段输入的详细信息请参考表7。

表7 时间段输入

输入示例

输出结果

描述

60

2 mons

采用数字表示时间段,默认单位是day,可以是小数或负数。特别的,负数时间段,在语义上,可以理解为“早于多久”。

31.25

1 mons 1 days 06:00:00

-365

-12 mons -5 days

1 years 1 mons 8 days 12:00:00

1 years 1 mons 8 days 12:00:00

采用POSTGRES格式表示时间段,可以正负混用,不区分大小写,输出结果为将输入时间段计算并转换得到的简化POSTGRES格式时间段。

-13 months -10 hours

-1 years -25 days -04:00:00

-2 YEARS +5 MONTHS 10 DAYS

-1 years -6 mons -25 days -06:00:00

P-1.1Y10M

-3 mons -5 days -06:00:00

采用ISO-8601格式表示时间段,可以正负混用,不区分大小写,输出结果为将输入时间段计算并转换得到的简化POSTGRES格式时间段。

-12H

-12:00:00

示例:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
--创建表。
gaussdb=# CREATE TABLE reltime_type_tab(col1 character(30), col2 reltime);

--插入数据。
gaussdb=# INSERT INTO reltime_type_tab VALUES ('90', '90');
gaussdb=# INSERT INTO reltime_type_tab VALUES ('-366', '-366');
gaussdb=# INSERT INTO reltime_type_tab VALUES ('1975.25', '1975.25');
gaussdb=# INSERT INTO reltime_type_tab VALUES ('-2 YEARS +5 MONTHS 10 DAYS', '-2 YEARS +5 MONTHS 10 DAYS');
gaussdb=# INSERT INTO reltime_type_tab VALUES ('30 DAYS 12:00:00', '30 DAYS 12:00:00');
gaussdb=# INSERT INTO reltime_type_tab VALUES ('P-1.1Y10M', 'P-1.1Y10M');

--查看数据。
gaussdb=# SELECT * FROM reltime_type_tab;
              col1              |                col2                 
--------------------------------+-------------------------------------
 90                             | 3 mons
 -366                           | -1 years -18:00:00
 1975.25                        | 5 years 4 mons 29 days
 -2 YEARS +5 MONTHS 10 DAYS     | -1 years -6 mons -25 days -06:00:00
 30 DAYS 12:00:00               | 1 mon 12:00:00
 P-1.1Y10M                      | -3 mons -5 days -06:00:00
(6 rows)

--删除表。
gaussdb=# DROP TABLE reltime_type_tab;

相关文档