日期/时间类型
支持的日期/时间类型
该类型的操作符和内置函数请参见时间和日期处理函数和操作符。
如果其他的数据库时间格式和Vastbase的时间格式不一致,可通过修改配置参数DateStyle的值来保持一致。
DateStyle参数用于设置日期和时间值的显示格式,以及有歧义的输入值的解析规则。
表 1 日期/时间类型
名称 描述 存储空间 DATE 日期和时间。 4字节(Oracle兼容模式下存储空间大小为8字节) TIME [(p)] [WITHOUT TIME ZONE] 只用于一日内时间。
p表示小数点后的精度,取值范围为0~6。8字节 TIME [(p)] [WITH TIME ZONE] 只用于一日内时间,带时区。别名为TIMETZ。
p表示小数点后的精度,取值范围为0~6。12字节 TIMESTAMP[(p)] [WITHOUT TIME ZONE] 日期和时间。
p表示小数点后的精度,取值范围为0~6。8字节 TIMESTAMP[(p)][WITH TIME ZONE] 日期和时间,带时区。别名为TIMESTAMPTZ。
p表示小数点后的精度,取值范围为0~6。8字节 SMALLDATETIME 日期和时间,不带时区。精确到分钟,秒位大于等于30秒进一位。 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天,计算输入值对应的相对时间间隔,输出采用POSTGRES格式。4字节 abstime 日期和时间。
格式为:YYYY-MM-DD hh:mm:ss+timezone
取值范围为1901-12-13 20:45:53 GMT~2038-01-18 23:59:59 GMT,精度为秒。4字节 oradate 日期和时间,映射为date数据类型。 4字节(Oracle兼容模式下存储空间大小为8字节) 类型abstime是低精度类型,被用于系统内部。不鼓励用户在应用里使用此类型,此内部类型可能会在未来的版本里消失。
示例
示例1: 创建date类型数据。
1、创建表。
CREATE TABLE date_type_tab(coll date);
2、插入数据。
INSERT INTO date_type_tab VALUES (date '12-10-2010');
3、查看数据。
SELECT * FROM date_type_tab;
结果返回如下:
coll --------------------- 2010-12-10 00:00:00 (1 row)
4、删除表。
DROP TABLE date_type_tab;
示例2: 创建time without time zone、time with time zone、timestamp without time zone、timestamp with time zone、smalldatetime五种数据类型类型数据。
1、创建表。
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);
2、插入数据。
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');
3、查看数据。
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)
4、删除表。
DROP TABLE time_type_tab;
示例3: 创建INTERVAL天数间隔类型数据。
1、创建表。
CREATE TABLE day_type_tab (a int,b INTERVAL DAY(3) TO SECOND (4));
2、插入数据。
INSERT INTO day_type_tab VALUES (1, INTERVAL '3' DAY);
3、查看数据。
SELECT * FROM day_type_tab;
结果返回如下:
a | b ---+-------- 1 | 3 days (1 row)
4、删除表。
DROP TABLE day_type_tab;
示例4: 创建INTERVAL年份间隔类型数据。
1、创建表。
CREATE TABLE year_type_tab(a int, b interval year (6));
2、插入数据。
INSERT INTO year_type_tab VALUES(1,interval '2' year);
3、查看数据。
SELECT * FROM year_type_tab;
结果返回如下:
a | b ---+--------- 1 | 2 years (1 row)
4、删除表。
DROP TABLE year_type_tab;
日期输入
日期和时间的输入几乎可以是任何合理的格式,包括ISO-8601格式、SQL-兼容格式、传统POSTGRES格式或者其它的形式。系统支持按照日、月、年的顺序自定义日期输入。如果把DateStyle参数设置为MDY就按照“月-日-年”解析,设置为DMY就按照“日-月-年”解析,设置为YMD就按照“年-月-日”解析。
日期的文本输入需要加单引号包围,语法如下:
type [ ( p ) ] 'value'
合法的日期分隔符是“-”和“/”,混用日期分隔符(“-”和“/”也不能混用)可能导致解析错误。
可选的精度声明中的p是一个整数,表示在秒域中小数部分的位数。下表显示了date类型的输入方式。
表 2 日期输入方式
例子 描述 1999-01-08 ISO 8601格式(建议格式),任何方式下都是1999年1月8号。 January 8, 1999 在任何datestyle输入模式下都无歧义。 1/8/1999 有歧义,在MDY模式下是一月八号,在DMY模式下是八月一号。 1/18/1999 MDY模式下是一月十八日,其它模式下被拒绝。 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 一月八日,除了在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、创建表。
CREATE TABLE date_type_tab(coll date);
2、插入数据。
INSERT INTO date_type_tab VALUES (date '12-10-2010');
3、查看数据。
SELECT * FROM date_type_tab;
结果返回如下:
coll --------------------- 2010-12-10 00:00:00 (1 row)
4、查看日期格式。
SHOW datestyle;
结果返回如下:
DateStyle ----------- ISO, MDY (1 row)
5、设置日期格式。
SET datestyle='YMD';
6、插入数据。
INSERT INTO date_type_tab VALUES(date '2010-12-11');
7、查看数据。
SELECT * FROM date_type_tab;
结果返回如下:
coll --------------------- 2010-12-10 00:00:00 2010-12-11 00:00:00 (2 rows)
8、删除表。
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一样,AM不影响数值 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、查询时间。
SELECT time '04:05:06';
结果返回如下:
time ---------- 04:05:06 (1 row)
2、查询PST时间。
SELECT time '04:05:06 PST';
结果返回如下:
time ---------- 04:05:06 (1 row)
3、查询带时区时间
SELECT time with time zone '04:05:06 PST';
结果返回如下:
timetz ------------- 04:05:06-08 (1 row)
特殊值
vastbase支持如下几个特殊值,在读取的时候将被转换成普通的日期/时间值。
表 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 示例:
1、创建测试表并插入数据。
CREATE TABLE realtime_type_special(col1 varchar(20), col2 date, col3 timestamp, col4 time); INSERT INTO realtime_type_special VALUES('epoch', 'epoch', 'epoch', NULL); INSERT INTO realtime_type_special VALUES('infinity', NULL, 'epoch', NULL); INSERT INTO realtime_type_special VALUES('now', 'now', 'now', 'now'); INSERT INTO realtime_type_special VALUES('today', 'today', 'today', NULL); INSERT INTO realtime_type_special VALUES('tomorrow', 'tomorrow', 'tomorrow', NULL); INSERT INTO realtime_type_special VALUES('yesterday', 'yesterday', 'yesterday', NULL);
2、查看数据。
SELECT * FROM realtime_type_special; SELECT * FROM realtime_type_special WHERE col3 < 'infinity'; SELECT * FROM realtime_type_special WHERE col3 > '-infinity'; SELECT * FROM realtime_type_special WHERE col3 > 'now'; SELECT * FROM realtime_type_special WHERE col3 = 'today'; SELECT * FROM realtime_type_special WHERE col3 = 'tomorrow'; SELECT * FROM realtime_type_special WHERE col3 > 'yesterday'; SELECT TIME 'allballs';
返回结果依次为:
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) 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) 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) col1 | col2 | col3 | col4 ----------+---------------------+---------------------+------ tomorrow | 2023-02-28 00:00:00 | 2023-02-28 00:00:00 | (1 row) col1 | col2 | col3 | col4 -------+---------------------+---------------------+------ today | 2023-02-27 00:00:00 | 2023-02-27 00:00:00 | (1 row) col1 | col2 | col3 | col4 ----------+---------------------+---------------------+------ tomorrow | 2023-02-28 00:00:00 | 2023-02-28 00:00:00 | (1 row) 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) time ---------- 00:00:00 (1 row)
3、删除表。
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格式表示时间段,可以正负混用,”H”不区分大小写,输出结果为将输入时间段计算并转换得到的简化POSTGRES格式时间段。 -12H -12:00:00 示例
1、创建表。
CREATE TABLE reltime_type_tab(col1 character(30), col2 reltime);
2、插入数据。
INSERT INTO reltime_type_tab VALUES ('90', '90'); INSERT INTO reltime_type_tab VALUES ('-366', '-366'); INSERT INTO reltime_type_tab VALUES ('1975.25', '1975.25'); INSERT INTO reltime_type_tab VALUES ('-2 YEARS +5 MONTHS 10 DAYS', '-2 YEARS +5 MONTHS 10 DAYS'); INSERT INTO reltime_type_tab VALUES ('30 DAYS 12:00:00', '30 DAYS 12:00:00'); INSERT INTO reltime_type_tab VALUES ('P-1.1Y10M', 'P-1.1Y10M');
3、查看数据。
SELECT * FROM reltime_type_tab;
结果返回如下:
col1 | col2 --------------------------------+------------------------------------- 1975.25 | 5 years 4 mons 29 days -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 -366 | -1 years -18:00:00 90 | 3 mons 30 DAYS 12:00:00 | 1 mon 12:00:00 (6 rows)
4、删除表。
DROP TABLE reltime_type_tab;