日期/时间类型
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指定。具体请参见语法格式。
| 名称 | 描述 | 存储空间 |
|---|---|---|
| DATE | 日期和时间。 最小值:公元前4713年,4714-11-24 BC。最大值:公元5874897年,5874897-12-31AD。 在设置sql_compatibility = 'MYSQL'、b_format_version = '5.7'和b_format_dev_version = 's1'三个参数后,输入和输出格式、范围的规格有差异:
说明: 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'三个参数后,不限定于表示一天内的时间,如可以表示持续时间、相对时间等概念,且格式、范围、精度的规格有差异:
| 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]类型,但格式、范围、精度的规格有差异:
| 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秒。
| 16字节 |
| INTERVAL [FIELDS] [ (p) ] | 时间间隔。
| 12字节 |
| reltime | 相对时间间隔。
| 4字节 |
| abstime | 日期和时间。
| 4字节 |
| datetime[(p)] | 日期和时间。 仅在设置sql_compatibility = 'MYSQL'、b_format_version = '5.7'以及b_format_dev_version = 's1'三个参数后生效,datetime[(p)]类型会被替换为TIMESTAMP[(p)] WITHOUT TIME ZONE类型,但格式、范围、精度、时区处理的规格有差异:
| 8字节 |
| year[(w)] | 年份。 仅在设置sql_compatibility = 'MYSQL'参数后生效。
| 1字节 |
| DATEA | 日期和时间。 仅在设置sql_compatibility = 'ORA'参数后生效。 最小值:公元前4712年1月1日0时0分0秒。 最大值:公元9999年12月31日23时59分59秒。 输入格式:输入格式必须符合参数nls_date_format设置的时间格式,nls_date_format支持的格式请参考表2。
输出格式:仅支持YYYY-MM-DD HH24:MI:SS AD/BC的时间格式,且不受DateStyle参数的影响。 范围:公元前4712年1月1日0时0分0秒 ~ 公元9999年12月31日23时59分59秒, 非法输入或输入超过范围,会报错。 精度:不保留小数点后精度,最小精度为秒。 说明:
| 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; |
| 格式 | 描述 |
|---|---|
| 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类型的输入格式。
| 例子 | 描述 |
|---|---|
| 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 |
|
| 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。
| 例子 | 描述 |
|---|---|
| 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 | 用名称声明的时区。 |
| 例子 | 描述 |
|---|---|
| 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。
| 输入字符串 | 适用类型 | 描述 |
|---|---|---|
| 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。
| 输入示例 | 输出结果 | 描述 |
|---|---|---|
| 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; |