日期/时间类型
GaussDB支持的日期/时间类型请参见表1。该类型的操作符和内置函数请参见时间和日期处理函数和操作符。
如果其他的数据库时间格式和GaussDB的时间格式不一致,可通过修改配置参数DateStyle的值来保持一致。
名称 |
描述 |
存储空间 |
---|---|---|
DATE |
日期。
说明:
A兼容性下,数据库将空字符串作为NULL处理,数据类型DATE会被替换为TIMESTAMP(0) WITHOUT TIME ZONE。 |
4字节(兼容模式A下存储空间大小为8字节) |
TIME [(p)] [WITHOUT TIME ZONE] |
只用于一日内时间。 p表示小数点后的精度,取值范围为0~6。
|
8字节 |
TIME [(p)] [WITH TIME ZONE] |
只用于一日内时间,带时区。 p表示小数点后的精度,取值范围为0~6。
|
12字节 |
TIMESTAMP[(p)] [WITHOUT TIME ZONE] |
日期和时间。 p表示小数点后的精度,取值范围为0~6。
|
8字节 |
TIMESTAMP[(p)][WITH TIME ZONE] |
日期和时间,带时区。TIMESTAMP的别名为TIMESTAMPTZ。 p表示小数点后的精度,取值范围为0~6。
时区更新:部分国家或地区因为政治、经济、战争等因素经常会更新时区信息, 数据库系统也因此需要同步修改时区文件以确保时间内容的正确性。 GaussDB时区类型目前只涉及timestamp with timezone,当新的时区文件生效时,不会对已有的数据进行变更,新数据会随时区文件信息进行同步调整。 |
8字节 |
SMALLDATETIME |
日期和时间,不带时区。 精确到分钟,秒位大于等于30秒进一位。
|
8字节 |
INTERVAL DAY (l) TO SECOND (p) |
时间间隔,X天X小时X分X秒。
|
16字节 |
INTERVAL [FIELDS] [ (p) ] |
时间间隔。
|
12字节 |
reltime |
相对时间间隔。
|
4字节 |
abstime |
日期和时间。
|
4字节 |
- 年通过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 |
--创建表。 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=# DROP TABLE year_type_tab; |
日期输入
日期和时间的输入几乎可以是任何合理的格式,包括ISO-8601格式、SQL-兼容格式、传统POSTGRES格式或者其它的格式。系统支持按照日、月、年的顺序自定义日期输入。如果把DateStyle参数设置为MDY就按照“月-日-年”解析,设置为DMY就按照“日-月-年”解析,设置为YMD就按照“年-月-日”解析。
日期的文本输入需要加单引号包围,语法如下:
type [ ( p ) ] 'value'
可选的精度声明中的p是一个整数,表示在秒域中小数部分的位数。表2显示了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 |
一月八日,除了在YMD模式下是错误的之外。 |
Jan-08-99 |
一月八日,除了在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类型的输入中声明了时区,则会忽略这个时区。
时间输入类型的详细信息请参见表3,时区输入类型的详细信息请参加表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 |
用名称声明的时区 |
例子 |
描述 |
---|---|
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支持几个特殊值,在读取的时候将被转换成普通的日期/时间值,请参考表5。
输入字符串 |
适用类型 |
描述 |
---|---|---|
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=# SELECT TIME 'allballs'; time ---------- 00:00:00 (1 row) --删除表。 gaussdb=# DROP TABLE realtime_type_special;
时间段输入
reltime的输入方式可以采用任何合法的时间段文本格式,包括数字形式(含负数和小数)及时间形式,其中时间形式的输入支持SQL标准格式、ISO-8601格式、POSTGRES格式等。另外,文本输入需要加单引号。
时间段输入的详细信息请参考表6。
输入示例 |
输出结果 |
描述 |
---|---|---|
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; |