5
日期
/
时间类型
KingbaseES
支持
SQL
中所有的日期和时间类型,如下表所示。这些数据类型上可用的操作如
时间
/
日期函数
和操作符
所述。日期根据公历来计算,即使对于该历法被引入之前的年份也一样。
表
7.5.1:
日期
/
时间类型
名字
存储
尺寸
描述
最小值
最大值
解析
度
timestamp[ (p
)] [ without
time zone ]
8
字
节
包括日期和时间(无
时区)
4713 BC
294276 AD
1
微
秒
timestamp[ (p
) ] with
time zone
8
字
节
包括日期和时间,有
时区
4713 BC
294276 AD
1
微
秒
timestamp[ (p
)] with lo
cal time zone
8
字
节
包括日期和时间,有
时区
4713 BC
294276 AD
1
微
秒
date
4
字
节
日期(没有一天中的
时间)
4713 BC
5874897 AD
1
日
time [ (p
) ] [ without time
zone ]
8
字
节
一天中的时间(无日
期)
00:00:00
24:00:00
1
微
秒
time [ (p
) ] with time zone
12
字节
仅仅是一天中的时
间(没有日期),带
有时区
00:00:00+1459
24:00:00-
1459
1
微
秒
int erval [ fields
] [
(
“p“
) ]
16
字节
时间间隔
-178000000
年
178000000
年
1
微
秒
Note:
SQL
要求只写
timestamp
等效于
timestamp without time zone
,并且
KingbaseES
鼓励这
种行为。
timestamptz
被接受为
timestamp with time zone
的一种简写,这是一种
KingbaseES
的扩
展。
time
、
timestamp
和
interval
接受一个可选的精度值
“p“
,这个精度值声明在秒域中小数点之后保留的
位数。缺省情况下,在精度上没有明确的边界。
“p“
允许的范围是从
0
到
6
。
interval
类型有一个附加选项,它可以通过写下面之一的短语来限制存储的
fields
的集合:
YEAR
MONTH
DAY
HOUR
MINUTE
SECOND
YEAR TO MONTH
YEAR_MONTH
DAY TO HOUR
DAY_HOUR
DAY TO MINUTE
DAY_MINUTE
DAY TO SECOND
DAY_SECOND
HOUR TO MINUTE
HOUR_MINUTE
HOUR TO SECOND
HOUR_SECOND
MINUTE TO SECOND
MINUTE_SECOND
Note:
YEAR_MONTH
、
DAY_HOUR
、
DAY_MINUTE
、
DAY_SECOND
、
HOUR_MINUTE
、
HOUR_SECOND
、
MINUTE_SECOND
是兼容
mysql unit
类型,需要通过
mysql_interval_style
参数开启,
set mysql_interval_style to
on
。
注意如果
“fields“
和
“p“
被指定,
“fields“
必须包括
SECOND
,因为精度只应用于秒。
类型
time with time zone
是
SQL
标准定义的,但是该定义显示出了一些会影响可用性的性质。在大
多数情况下,
date
、
time
、
timestamp without time zone
和
timestamp with time zone
的组
合就应该能提供任何应用所需的全范围的日期
/
时间功能。
5.1
日期
/
时间输入
日期和时间的输入可以接受几乎任何合理的格式,包括
ISO 8601
、
SQL-
兼容的、传统
KINGBASE
的和其他
的形式。对于一些格式,日期输入里的日、月和年的顺序会让人混淆,并且支持指定所预期的这些域的顺序。
把
DateStyle
参数设置为
MDY
,就是选择“月-日-年”的解释,设置为
DMY
就是“日-月-年”,而
YMD
是“年-月-日”。
KingbaseES
在 处 理 日 期
/
时 间 输 入 输 出 上 比
SQL
标 准 要 求 的 更 灵 活。 当 前
KingbaseES
存 在
四 个
STRING
类 型 的 参 数
NLS_DATE_FORMAT
、
ORA_DATE_STYLE
、
NLS_TIMESTAMP_FORMAT
、
NLS_TIMESTAMP_TZ_FORMAT
,默认值分别为
YYYY-MM-DD HH24:MI:SS
、
YYYY-MM-DD HH24:MI:SS
、
YYYY-MM-DD HH24:mi:ss.FF
、
YYYY-MM-DD HH24:mi:ss.FF TZH:TZM
,分别可由用户在一次连接中进行
指定
date
、
date
、
timestamp
、
timestamptz
的格式。例如将
NLS_DATE_FORMAT
参数设置为
YYYY-MM-DD
格式后,查询时
date
类型将默认输出‘
2021-08-01
’、‘
1985-12-28
’等样式的字符串;输入时,将默认按
照
YYYY-MM-DD
格式解析,能正确解析‘
2021-08-01
’、‘
1985-12-28
’等样式字符串日期,而无法解析
‘
08.01.2021
’、‘
12.28.1985
’等样式字符串。
ORA_DATE_STYLE
定义
date
,
NLS_TIMESTAMP_FORMAT
、
NLS_TIMESTAMP_TZ_FORMAT
分别定义
timestamp
、
timestamptz
类型的格式,皆同
NLS_DATE_FORMAT
参
数类似,影响日期
/
时间的默认输入与输出格式,此处不再赘述。具体的日期
/
时间输入输出格式的定义请参考
数
据类型格式化函数
章节。注意:
NLS_DATE_FORMAT
、
ORA_DATE_STYLE
、
NLS_TIMESTAMP_FORMAT
、
NLS_TIMESTAMP_TZ_FORMAT
参数需在
Oracle
模式下,且参数
ORA_STYLE_NLS_DATE_FORMAT
处于
打开的情况下生效。
请记住任何日期或者时间的文字输入需要由单引号包围,就象一个文本字符串一样。参考 其他类型的常量获
取更多信息。
SQL
要求下面的语法
type [ (p) ] 'value'
其中
“p“
是一个可选的精度声明,它给出了在秒域中的小数位数目。精度可以被指定给
time
、
timestamp
和
interval
类型,并且可以取从
0
到
6
的值。这允许前文所述的值。如果在一个常数声明中没有指定任
何精度,它将默认取文字值的精度(但不能超过
6
位)。
5.1.1
日期
表
7.5.2
显示了
date
类型可能的输入方式。
表
7.5.3:
日期输入
例子
描述
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
年
5.1.2
时间
当日时间类型是
time [ (p
) ] without time zone
和
time [ (p
) ] with time zone
。只写
time
等效于
time
without time zone
。
这些类型的有效输入由当日时间后面跟着可选的时区组成(参阅
表
7.5.4
和
表
7.5.3
)。如果在
time
without time zone
的输入中指定了时区,那么它会被无声地忽略。你也可以指定一个日期但是它会被
忽略,除非你使用了一个涉及到夏令时规则的时区,例如
America/New_York
。在这种情况下,为了判断
是应用了标准时间还是夏令时时间,要求指定该日期。适当的时区偏移被记录在
time with time zone
值中。
表
7.5.4:
时间输入
例子
描述
04:05:06.789
ISO 8601
04:05:06
ISO 8601
04:05
ISO 8601
040506
ISO 8601
04:05 AM
和
04:05
一样,
AM
并不影响值
04: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
全名指定的时区
表
7.5.5:
时区输入
例子
描述
PST
缩写(太平洋标准时间)
America/New_York
完整时区名
PST8PDT
POSIX
风格的时区声明
-8:00
PST
的
ISO-8601
偏移
-800
PST
的
ISO-8601
偏移
-8
PST
的
ISO-8601
偏移
zulu
UTC
的军方缩写
z
zulu
的短形式
参考
数据类型
可以了解如何指定时区。
5.1.3
时间戳
时间戳类型的有效输入由一个日期和时间的串接组成,后面跟着一个可选的时区,一个可选的
AD
或者
BC
(另外,
AD
/
BC
可以出现在时区前面,但这个顺序并非最佳)。因此:
1999
-
01
-
08 04
:
05
:
06
和:
1999
-
01
-
08 04
:
05
:
06
-
8
:
00
都是有效的值,它遵循
ISO 8601
标准。另外,使用广泛的格式:
January
8 04
:
05
:
06 1999
PST
也被支持。
SQL
标准通过“
+
”或者“
-
”符号的存在以及时间后面的时区偏移来区分
timestamp without time
zone
和
timestamp with time zone
文字。因此,根据标准,
TIMESTAMP
'2004-10-19 10:23:54'
是一个
timestamp without time zone
,而
TIMESTAMP
'2004-10-19 10:23:54+02'
是一个
timestamp with time zone
。
KingbaseES
从来不会在确定文字串的类型之前检查其内容,因此
会把上面两个都看做是
timestamp without time zone
。因此要保证把上面的文字当作
timestamp
with time zone
看待,就要给它正确的显式类型:
TIMESTAMP WITH TIME ZONE
'2004-10-19 10:23:54+02'
如果一个文字已被确定是
timestamp without time zone
,
KingbaseES
将不声不响忽略任何其中指出
的时区。即,结果值是从输入值的日期
/
时间域衍生出来的,并且没有就时区进行调整。
对于
timestamp with time zone
,内部存储的值总是
UTC
(全球统一时间,以前也叫格林威治时间
GMT
)。如果一个输入值有明确的时区声明,那么它将用该时区合适的偏移量转换成
UTC
。如果在输入串里
没有时区声明,那么它就被假设是在系统的
TimeZone
参数里的那个时区,然后使用这个
timezone
时区的
偏移转换成
UTC
。
如果一个
timestamp with time zone
值被输出,那么它总是从
UTC
转换成当前的
timezone
时区,
并且显示为该时区的本地时间。要看其它时区的时间,要么修改
timezone
,要么使用
AT TIME ZONE
构
造(参阅
AT TIME ZONE
)。
在
timestamp without time zone
和
timestamp with time zone
之 间 的 转 换 通 常 假 设
timestamp without time zone
值应该以
timezone
本地时间的形式接受或者写出。为该转换指
定一个不同的可以用
AT TIME ZONE
。
7.5.1.4
特殊值
为了方便,
KingbaseES
支持一些特殊日期
/
时间输入值,如表
5-5
所示。这些值中
infinity
和
-infinity
被在系统内部以特殊方式表示并且将被原封不动地显示。但是其他的仅仅只是概念上的速写,当被读到的时
候会被转换为正常的日期
/
时间值(特殊地,
now
及相关串在被读到时立刻被转换到一个指定的时间值)。在
作为常量在
SQL
命令中使用时,所有这些值需要被包括在单引号内。
表
7.5.6:
特殊日期
/
时间输入
输入串
合法类型
描述
epoch
date
,
timestamp
1970-01-01 00:00 :00+00
(
Unix
系统时间
0
)
infinity
date
,
timestamp
比任何其他时间戳都晚
-infinity
date
,
timestamp
比任何其他时间戳都早
now
date
,
time
,
timestamp
当前事务的开始时间
today
date
,
timestamp
当日午夜
tomorrow
date
,
timestamp
明日午夜
yesterday
date
,
timestamp
昨日午夜
allballs
time
00:00:00.00 UTC
下列
SQL-
兼容的函数可以被用来为相应的数据类型获得当前时间值:
CURRENT_DATE
、
CURRENT_TIME
、
CURRENT_TIMESTAMP
、
LOCALTIME
、
LOCALTIMESTAMP
。后四种接受一个可选的亚秒精度声明(参见
时
间
/
日期函数和操作符
)
5.2
日期时间输出
时间
/
日期类型的输出格式可以设成四种风格之一:
ISO 8601
、
SQL
(
Ingres
)、传统的
KINGBASE
(
Unix
的
date
格式)或
German
。缺省是
ISO
格式(
ISO
标准要求使用
ISO 8601
格式。
ISO
输出格式的名字是历史偶然)。
下表显示了每种输出风格的例子。
date
输出通常只有日期或时间部分和例子中一致。不过,
KINGBASE
风
格输出的是
ISO
格式的只有日期的值。
表
7.5.7:
日期
/
时间输出风格
风格声明
描述
例子
ISO
ISO 8601, SQL
标准
1997-12-17 07:37:16-08
SQL
传统风格
12/17/1997 07:37:16.00 PST
Kingbase
原始风格
Wed Dec 17 07:37:16 1997 PST
German
地区风格
17.12.1997 07:37:16.00 PST
Note:
ISO 8601
指定使用大写字母
T
来分隔日期和时间。
KingbaseES
在输入上接受这种格式,但是在输出
时它采用一个空格而不是
T
,如上所示。和一些其他数据库系统一样,这是为了可读性以及与
RFC 3339
的
一致性。
SQL
和
KINGBASE
风格中,如果
DMY
域顺序被指定,“日”将出现在“月”之前,否则“月”出现在“日”
之前(有关该设置如何影响输入值的解释,请参考
日期
/
时间类型
)。下表给出了例子。
表
7.5.8:
日期顺序习惯
datestyle
设置
输入顺序
例子输出
SQL, DMY
“
日
“
/
“
月
“
/
“
年
“
17/12/1997 15:37:16.00 CET
SQL, MDY
“
月
“
/
“
日
“
/
“
年
“
12/17/1997 07:37:16.00 PST
Kingbase, DMY
“
日
“
/
“
月
“
/
“
年
“
Wed 17 Dec 07:37:16 1997 PST
日期
/
时间风格可以由用户使用
SET datestyle
命令选取,在
kingbase.conf
配置文件里的参数
Dat
eStyle
设置或者在服务器或客户端的
KINGBASE_DATESTYLE
环境变量里设置。
格式化函数
to_char
(见
数据类型格式化函数
)也可以作为一个更灵活的方式来格式化日期
/
时间输出。
5.3
时区
时区和时区习惯不仅仅受地球几何形状的影响,还受到政治决定的影响。到了
19
世纪,全球的时区变得稍
微标准化了些,但是还是易于遭受随意的修改,部分是因为夏时制规则。
KingbaseES
使用广泛使用的
IANA
(Olson)
时区数据库来得到有关历史时区规则的信息。对于未来的时间,我们假设关于一个给定时区的最新已
知规则将会一直持续到无穷远的未来。
KingbaseES
努力在典型使用中与
SQL
标准的定义相兼容。但
SQL
标准在日期和时间类型和功能上有一些奇
怪的混淆。两个显而易见的问题是:
•
尽管
date
类型与时区没有联系,而
time
类型却可以有。然而,现实世界的时区只有在与时间和日
期都关联时才有意义,因为偏移(时差)可能因为实行类似夏时制这样的制度而在一年里有所变化。
•
缺省的时区会指定一个到
UTC
的数字常量偏移(时差)。因此,当跨
DST
边界做日期
/
时间算术时,我
们根本不可能适应于夏时制时间。
为了克服这些困难,我们建议在使用时区的时候,使用那些同时包含日期和时间的日期
/
时间类型。我们不建
议使用类型
time with time zone
(尽管
KingbaseES
出于遗留应用以及与
SQL
标准兼容性的考虑支持
这个类型)。
KingbaseES
假设你用于任何类型的本地时区都只包含日期或时间。
在系统内部,所有时区相关的日期和时间都用
UTC
存储。它们在被显示给客户端之前会被转换成由
TimeZone
配置参数指定的本地时间。
KingbaseES
允许你使用三种不同形式指定时区:
•
一 个 完 整 的 时 区 名 字, 例 如
America/New_York
。 能 被 识 别 的 时 区 名 字 被 列 在
sys_timezone_names
视图中(参见
sys_timezone_names
) 。
KingbaseES
用广泛使用的
IANA
时区数据来实现该目的,因此相同的时区名字也可以在其他软件中被识别。
•
一个时区缩写,例如
PST
。这样一种声明仅仅定义了到
UTC
的一个特定偏移,而不像完整时区名那
样指出整套夏令时转换日期规则。能被识别的缩写被列在
sys_timezone_abbrevs
视图中(参见
sys_timezone_abbrevs
)。你不能将配置参数
TimeZone
或
log_timezone
设置成一个时区缩写,但是你可以
在日期
/
时间输入值和
AT TIME ZONE
操作符中使用时区缩写。
•
除了时区名和缩写,
KingbaseES
将接受
POSIX-
风格的时区声明,形式为
“STD““offset“
或
“STD““offset““DST“
,
其中
“STD“
是一个区域缩写、
“offset“
是从
UTC
西起的以小时计的数字偏移量、
“DST“
是一个可选的夏令
时区域缩写(被假定为给定偏移量提前一小时)。例如,如果
EST5EDT
还不是一个被识别的区域名,
它可以被接受并且可能和美国东海岸时间的功效相同。在这种语法中,一个时区缩写可以是一个字母
的字符串或者由尖括号(
<>
)包围的任意字符串。当一个夏令时区域缩写出现时,会假定根据
IANA
时区数据库的
posixrules
条目中使用的同一个夏令时转换规则使用它。在一个标准的
KingbaseES
安装中,
posixrules
和
US/Eastern
相同,因此
POSIX-
风格的时区声明遵循美国的夏令时规则。
如果需要,你可以通过替换
posixrules
文件来调整这种行为。
简而言之,在缩写和全称之间是有不同的:缩写表示从
UTC
开始的一个特定偏移量,而很多全称表示一个
本地夏令时规则并且因此具有两种可能的
UTC
偏移量。例如,
2014-06-04 12:00 America/New_York
表示纽约本地时间的中午,这个特殊的日期是东部夏令时间(
UTC-4
)。因此
2014-06-04 12:00 EDT
指
定的是同一个时间点。但是
2014-06-04 12:00 EST
指定东部标准时间的中午(
UTC-5
),不管在那个日
期夏令时是否生效。
更要命的是,某些行政区已经使用相同的时区缩写在不同的时间表示不同的
UTC
偏移量。例如,在莫斯科
MSK
在某些年份表示
UTC+3
而在另一些年份表示
UTC+4
。
KingbaseES
会根据在指定的日期它们到底表示什
么(或者最近表示什么)来解释这种缩写。但是,正如上面的
EST
例子所示,这并不是必须和那一天的本
地标准时间相同。
你应该注意到
POSIX-
风格的时区特性可能导致伪造的输入被接受,因为它没有对区域缩写合理性的检查。
例如
SET TIMEZONE TO FOOBAR0
将会正常工作,让系统实际使用一个相当奇怪的
UTC
缩写。另一个需
要记住的问题是在
POSIX
时区名中,正值的偏移量被用于格林威治以西的位置。在其他情况下,
KingbaseES
将遵循
ISO-8601
惯例,认为正值的时区偏移量是格林威治以东。
在所有情况下,时区名及其缩写都是大小写不敏感的(这是对
KingbaseES V7
之前版本的一个修改,在这些
版本中某些环境下时区名是大小写敏感的而在另外一些环境中却是大小写不敏感的)。
时区名和缩写都不是硬写在服务器中的,它们是从存储在安装目录下的
.../share/timezone/
和
.../
share/timezonesets/
子目录中获取的。
TimeZone
配置参数可以在文件
kingbase.conf
中被设置,或者使用 服务器配置参数参考手册中描述的
任何一种标准方法设置。同时也有一些特殊的方法来设置它:
• SQL
命令
SET TIME ZONE
为会话设置时区。它是
SET TIMEZONE TO
的另一种拼写,它更加符合
SQL
的语法。
• libkci
客户端使用
KCITZ
环境变量来通过连接发送一个
SET TIME ZONE
命令给服务器。
5.4
间隔输入
interval
值可以使用下列语法书写:
[@] quantity unit [quantity unit...] [direction]
其中
“quantity“
是一个数字(很可能是有符号的);
“unit“
是毫秒、
millisecond
、
second
、
minute
、
hour
、
day
、
week
、
month
、
year
、
decade
、
century
、
millennium
或者缩写或者这些单位的复数;
“direction“
可
以是
ago
或者为空。
At
符号(
@
)是一个可选的噪声。不同单位的数量通过合适的符号计数被隐式地添加。
ago
对所有域求反。如果
IntervalStyle
被设置为
kingbase_verbose
,该语法也被用于间隔输出。
日、小时、分钟和秒的数量可以不适用显式的单位标记指定。例如,
'1 12:59:10'
被读作
'1 day 12
hours 59 min 10 sec'
。同样,一个年和月的组合可以使用一个横线指定,例如
'200-10'
被读作
'200
年
10
个月
'
(这些较短的形式事实上是
SQL
标准唯一许可的形式,并且在
IntervalStyle
被设置为
sql_standard
时用于输出)。
间隔值也可以被写成
ISO 8601
时间间隔,使用该标准
4.4.3.2
小节的“带标志符的格式”或者
4.4.3.3
小节的
“替代格式”。带标志符的格式看起来像这样:
P quantity unit [ quantity unit ...] [ T [ quantity unit ...]]
该串必须以一个
P
开始,并且可以包括一个引入当日时间单位的
T
。可用的单位缩写在表
5-8
中给出。单
位可以被忽略,并且可以以任何顺序指定,但是小于一天的单位必须出现在
T
之后。特别地,
M
的含义取决
于它出现在
T
之前还是之后。
表
7.5.9: ISO 8601
间隔单位缩写
缩写
含义
Y
年
M
月(在日期部分中)
W
周
D
日
H
小时
M
分钟
(
在时间部分中)
S
秒
如果使用替代格式:
P [ years-months-days ] [ T hours:minutes:seconds ]
串必须以
P
开始,并且一个
T
分隔间隔的日期和时间部分。其值按照类似于
ISO 8601
日期的数字给出。
在用一个
“
域
“
声明书写一个间隔常量时,或者为一个用
“
域
“
声明定义的间隔列赋予一个串时,对于为标记的
量的解释依赖于
“
域
“
。例如
INTERVAL '1' YEAR
被解读成
1
年,而
INTERVAL '1'
表示
1
秒。同样,
“
域
“
声明允许的最后一个有效域“右边”的域值会被无声地丢弃掉。例如书写
INTERVAL '1 day 2:03:04'
HOUR TO MINUTE
将会导致丢弃秒域,而不是日域。
根据
SQL
标准,一个间隔值的所有域都必须由相同的符号,这样一个领头的负号将会应用到所有域;例如
在间隔文字
'-1 2:03:04'
中的负号会被应用于日、小时、分钟和秒部分。
KingbaseES
允许域具有不同的符
号,并且在习惯上认为以文本表示的每个域具有独立的符号,因此在这个例子中小时、分钟和秒部分被认为
是正值。如果
IntervalStyle
被设置为
sql_standard
,则一个领头的符号将被认为是应用于所有域
(但是仅当没有额外符号出现)。否则将使用传统的
KingbaseES
解释。为了避免混淆,我们推荐在任何域为负
值时为每一个域都附加一个显式的符号。
在 冗 长 的 输 入 格 式 中, 以 及 在 更 紧 凑 输 入 格 式 的 某 些 域 中, 域 值 可 以 有 分 数 部 分; 例 如
'1.5
week'
或
'01:02:03.45'
。这样的输入被转换为合适的月数、日数和秒数用于存储。当这样会导致月
和日中的分数时,分数被加到低序域中,使用的转换因子是
1
月
=30
日和
1
日
=24
小时。例如,
'1.5
month'
会变成
1
月和
15
日。只有秒总是在输出时被显示为分数。
下表展示了一些有效
interval
输入的例子。
表
7.5.10:
间隔输入
例子
描述
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_days
和
justify_hours
可以用来调整溢出其正常范围之外的
days
和
hours
。
开启兼容
mysql interval
参数后,
interval
兼容了部分
mysql unit
类型和部分操作符
,quantity
支持字符和布尔类
型。
mysql interval
兼容通过参数:
mysql_interval_style
控制。兼容后
interval
值可以使用下列语法书写:
[@] interval expr unit
兼容以下
mysql unit:
1) YEAR_MONTH
等价于
YEAR TO MONTH
2) DAY_HOUR
等价于
DAY TO HOUR
3) DAY_MINUTE
等价于
DAY TO MINUTE
4) DAY_SECOND
等价于
DAY TO SECOND
5) HOUR_MINUTE
等价于
HOUR TO MINUTE
6) HOUR_SECOND
等价于
HOUR TO SECOND
7) MINUTE_SECOND
等价于
MINUTE TO SECOND
expr
支持以下操作符
:
1
、
+
支持两个整型或字符串或布尔类型相加;
2
、
-
支持两个整型或字符串或布尔类型相减;
3
、
*
支持两个整型或字符串或布尔类型相乘;
4
、
/
支持两个整型或字符串或布尔类型相除;
5
、
%
支持两个整型或字符串或布尔类型取余;
6
、
^
支持两个整型或字符串或布尔类型次方;
7
、
<
支持两个整型或字符串或布尔类型小于比较;
8
、
>
支持两个整型或字符串或布尔类型大于比较;
9
、
=
支持两个整型或字符串或布尔类型相等比较;
10
、
>=
支持两个整型或字符串或布尔类型大于等于比较;
11
、
<=
支持两个整型或字符串或布尔类型小于等于比较;
12
、
!=
支持两个整型或字符串或布尔类型不等于比较;
13
、
<>
支持两个整型或字符串或布尔类型不等于比较;
14
、
|
支持两个整型或字符串或布尔类型相等比较;
15
、
||
支持两个整型或字符串或布尔类型连接操作;
部分特殊运算操作结果和
mysql
不完全相等,
KingbaseES
对于空字符串进行计算返回
null,mysql
返回原数
据。由于
kingbaseES
和
mysql
的时间字符串的格式不一致,
mysql
将“
xx:xx:xx
”格式的时间处理为年月日,
KingbaseES
处理为时分秒,该特性暂不做兼容,所以对该格式的时间运算时表现为不同的结果。
KingbaseES
对于
0^0
计算结果与
mysql
存在差异,对于
KES
,意义为
0
的
0
次方,在通常情况下,该操作无意义,
Kingbase
的结算结果为
1
。对于
mysql ^
为异或操作符,
mysql
计算结果为
0
,暂时也不对该问题进行兼容。
5.5
间隔输出
间隔类型的输出格式可以被设置为四种风格之一:
sql_standard
、
kingbase
、
kingbase_verbose
或
iso_8601
,设置方法使用
SET intervalstyle
命令。默认值为
kingbase
格式。
表
7.5.10
展示了每
种输出风格的例子。
如果间隔值符合
SQL
标准的限制(仅年
-
月或仅日
-
时间,没有正负值部分的混合),
sql_standard
风格为
间隔文字串产生符合
SQL
标准规范的输出。否则输出将看起来像一个标准的年
-
月文字串跟着一个日
-
时间文
字串,并且带有显式添加的符号以区分混合符号的间隔。
当
DateStyle
参数被设置为
ISO
时,
kingbase
风格的输出匹配
KingbaseES V8
版本以前的输出。
当
DateStyle
参数被设置为非
ISO
输出时,
kingbase_verbose
风格的输出匹配
KingbaseES V8
版本
以前的输出。
iso_8601
风格的输出匹配在
ISO 8601
标准的
4.4.3.2
小节中描述的“带标志符的格式”。
表
7.5.11:
间隔输出风格例子
风格声明
年
-
月间隔
日
-
时间间隔
混合间隔
sql_standard
1-2
3 4:05:06
-1-2 +3 -4:05:06
kingbase
1 year 2 mons
3 days 04:05:06
-1 year -2 mons +3 days -04:05:06
kingbase_verbose
@ 1 year 2
mons
@ 3 days 4 hours 5 mins
6 secs
@ 1 year 2 mons -3 days 4 hours
5 mins 6 secs ago
iso_8601
P1Y2M
P3DT4h4M6S
P-1Y-2M3DT-4H-5M-6S