3.1.1.4. 日期/时间类型

日期时间数据类型为date 、timestamp[ (p)] [ without time zone ]、 timestamp[ (p) ] with time zone、 timestamp[ (p)] with local time zone、 time [ (p) ] [ without time zone ]、 time [ (p) ] with time zone 。 间隔数据类型为interval [ fields] [("p") ]。

日期时间的输入格式,包括 ISO 8601、SQL-兼容的、传统 KingbaseE的和其他的形式。对于一些格式,日期输入里的日、月和年的顺序会让人混淆,支持指定所预期的这些域的顺序。 把 DateStyle 参数设置为 MDY,表示"月-日-年",设置为 DMY 就是"日-月-年",设置为 YMD,表示"年-月-日"。

KingbaseES 在处理日期/时间输入输出上比SQL标准更灵活。

KingbaseES 有四个STRING类型的参数,设置日期/时间输入输出格式。

STRING类型的参数

默认格式

NLS_DATE_FORMAT

YYYY-MM-DD HH24:MI:SS

ORA_DATE_STYLE

YYYY-MM-DD HH24:MI:SS

NLS_TIMESTAMP_FORMAT

YYYY-MM-DD HH24:mi:ss.FF

NLS_TIMESTAMP_TZ_FORMAT

YYYY-MM-DD HH24:mi:ss.FF TZH:TZM

说明:这四个参数需在 Oracle 模式下,且参数 ORA_STYLE_NLS_DATE_FORMAT 处于打开的情况下生效。

3.1.1.4.1. DATE数据类型

语法:DATE

DATE数据类型存储日期和时间值。每一个DATE日期值KingbaseES存储如下值:年、月、日、时、分、秒。 TO_DATE 函数可以将字符或者数值转换为date 值。日期或者时间的输入需要由单引号括起来。

DATE类型可能的输入方式

表 3.1.29 日期输入

例子

描述

1999-01-08

ISO 8601; 任何模式下的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日

19990108

年和一年中的日子

J2451187

儒略日期

January 8, 99 BC

公元前99年

3.1.1.4.2. TIME数据类型

时间类型包括 time [ (p) ] without time zone 和 time [ (p) ] with time zone。

3.1.1.4.2.1. time [ (p) ] with time zone类型

语法:time [ (p) ] with time zone

表示一个带时区的 TIME值,包括时、分、秒信息, 定义了一个在'00:00:00.000000'和'23:59:59.999999'之间的有效时间。 p表示秒精度即秒字段中小数点后面的位数,取值范围为 0~6,如果未定义,在精度上没有明确的边界。

3.1.1.4.2.2. time [ (p) ] without time zone类型

语法:time [ (p) ] without time zone

表示一个不带带时区的 TIME 值,其他取值与带时区的相同。

3.1.1.4.2.3. time

语法:time 相当于time without time zone。

3.1.1.4.3. TIMESTAMP 数据类型

包括标准时区类型 timestamp[ (p)] [ without time zone ]、timestamp[ (p) ] with time zone 和本地时类型timestamp[ (p)] with local time zone。

3.1.1.4.3.1. timestamp[ (p)] [ without time zone ]类型

语法:timestamp[ (p)] [ without time zone ]

描述一个不带时区的 TIMESTAMP 值,包括年、月、日、时、分、秒信息。 p表示秒精度即秒字段中小数点后面的位数,取值范围为 0~6,如果未定义,在精度上没有明确的边界。

3.1.1.4.3.2. timestamp[ (p)] with time zone类型

语法:timestamp[ (p)] with time zone

描述一个不带时区的 TIMESTAMP 值,其定义是在 TIMESTAMP类型的后面加上时 区信息。时区的取值范围:取值范围:-12:59 ~ +14:00 之间。 例如:TIMESTAMP WITH TIME ZONE '2004-10-19 10:23:54+02'。

对于 timestamp with time zone,内部存储的值总是 UTC (全球统一时间,以前也叫格林威治时间GMT)。如果一个输入值有明确的时区声明,那么它将用该时区合适的偏移量转换成 UTC。如果在输入串里没有时区声明,那么它就被假设是在系统的 TimeZone 参数里的那个时区,然后使用这个 TimeZone 时区的偏移转换成 UTC。

如果一个 timestamp with time zone 值被输出,那么它总是从 UTC 转换成当前的 TimeZone时区,并且显示为该时区的本地时间。要看其它时区的时间,要么修改 timezone,要么使用 AT TIME ZONE 。

时区名和缩写从存储在安装目录下的.../share/timezone/和.../share/timezonesets/子目录中获取的。 TimeZone 配置参数可以在文件 kingbase.conf 中被设置,或者通过服务器配置参数参考手册中描述的任何一种标准方法设置。

语法:timestamp[ (p)] with local time zone

表示本地时区的TIMESTAMP值,时区的取值范围:取值范围:-12:59 ~ +14:00 之间。

3.1.1.4.4. INTERVAL数据类型

语法:interval [ fields] [('p')]

Fields 可选项如下:

Fields 选项

描述

YEAR

描述若干年的间隔 INTERVAL YEAR '9'

MONTH

描述若干月的间隔 INTERVAL MONTH '9'

DAY

描述若干天的间隔 INTERVAL DAY '9'

HOUR

描述若干小时的间隔 INTERVAL HOUR '9'

MINUTE

描述若干分钟的间隔 INTERVAL MINUTE '9'

SECOND

描述若干分钟的间隔 INTERVAL MINUTE '9'

YEAR TO MONTH

描述若干年若干月间隔 INTERVAL YEAR TO MONTH '10-9'

YEAR_MONTH

描述若干年若干月间隔,兼容MySQL

DAY TO HOUR

描述若干天若干小时间隔 INTERVAL DAY TO HOUR '10 9'

DAY_HOUR

描述若干天若干小时间隔,兼容MySQL

DAY TO MINUTE

描述若干天若干分钟间隔 INTERVAL DAY TO MINUTE '10 9:09'

DAY_MINUTE

描述若干天若干分钟间隔,兼容MySQL

DAY TO SECOND

描述若干天若干秒间隔 INTERVAL DAY TO SECOND '10 9:09:50'

DAY_SECOND

描述若干天若干秒间隔,兼容MySQL

HOUR TO MINUTE

描述若干小时若干分钟间隔 INTERVAL HOUR TO MINUTE '10:09'

HOUR_MINUTE

描述若干小时若干分钟间隔,兼容MySQL

HOUR TO SECOND

描述若干小时若干秒间隔 INTERVAL HOUR TO SECOND '10:09:10'

HOUR_SECOND

描述若干小时若干秒间隔,兼容MySQL

MINUTE TO SECOND

描述若干分钟若干秒间隔 INTERVAL MINUTE TO SECOND ' 09:10'

MINUTE_SECOND

描述若干分钟若干秒间隔,兼容MySQL

兼容 mysql unit 类型,开启mysql_interval_style 参数,set mysql_interval_style to on才能生效。 P 表示精度, 如果 "p"被指定,"fields"必须包括 SECOND,因为精度只应用于秒。

语法:[@] quantity unit [quantity unit...] [direction]

quantity 表示一个可以带符号的数字; unit 是millisecond、second、minute、hour、day、week、month、year、decade、century、millennium 或者缩写或者这些单位的复数;

direction 取值为 ago 。表示对所有域求反。

如果 IntervalStyle 被设置为 kingbase_verbose,该语法也被用于间隔输出。 日、小时、分钟和秒的数量可以不适用显式的单位标记指定。例如,'1 12:59:10'被读作'1 day 12 hours 59 min 10 sec'。同样,一个年和月的组合可以使用一个横线指定,例如'200-10'被读作'200 年 10 个月'。

语法:P quantity unit [ quantity unit ...] [ T [ quantity unit ...]]

该串必须以一个 P 开始,并且可以包括一个当日时间单位的 T。单位可以被忽略,也可以以任何顺序指定,但是小于一天的单位必须出现在 T 之后。特别地,M 的含义取决于它出现在 T 之前还是之后。

可用的单位缩写如下表:

表 3.1.30 ISO 8601 间隔单位缩写

缩写

含义

Y

M

月(在日期部分中)

W

D

H

小时

M

分钟 (在时间部分中)

S

语法:P [ years-months-days ] [ T hours:minutes:seconds ]

以 P 开始,并且 T 将时间间隔的日期和时间部分分隔开。 KingbaseES 允许域具有不同的符号,并且认为以常量表示的每个域具有独立的符号,因此在例子'-1 2:03:04'中,日为负数,小时、分钟和秒部分被认为是正值。

如果 IntervalStyle 被设置为 sql_standard,则最前面的符号将被认为是应用于所有域 (但是仅当没有额外符号出现),在例子'-1 2:03:04'中,负号会被应用于日、小时、分钟和秒部分。 为了避免混淆,我们推荐在任何域为负值时为每一个域都附加一个显式的符号。

下表展示了一些有效interval输入的例子。

表 3.1.31 间隔输入

例子

描述

1-2

SQL标准格式:1年2个月

3 4:05:06

SQL标准格式:3日4小时5分钟6秒

1 year 2 months 3 days 4 hours 5 minutes 6 seconds

传统Kingbase 格式:1年2个月3日4小时5分钟6秒钟

P1Y2M3DT4h4M6S

“带标志符的”ISO 8601 格式:含义同上

P0001-02-03T04:05:06

ISO 8601 的“替代格式”:含义同上

在内部,interval值被存储为months、days以及seconds。之所以这样做是因为一个月中的天数是变化的,并且在涉及到夏令时调整时一天可以有23或者25个小时。months以及days域是整数,而seconds域可以存储分数。因为区间通常是从常量字符串或者timestamp减法创建而来,这种存储方法在大部分情况下都很好,但是也可能导致预料之外的结果:

SELECT EXTRACT(hours from '80 minutes'::interval);
 date_part
-----------
         1

SELECT EXTRACT(days from '80 hours'::interval);
 date_part
-----------
         0

函数justify_daysjustify_hours可以用来调整溢出其正常范围之外的days和hours。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐