本文介绍了PolarDB PostgreSQL版(兼容Oracle)支持的日期类型。
polar_comp_redwood_date
都已设定为true
。名称 | 存储大小 | 描述 | 最小值 | 最大值 | 精度 |
---|---|---|---|---|---|
DATE | 8 bytes | 日期和时间。 | 4713 BC | 5874897 AD | 1 秒 |
INTERVAL DAY TO SECOND [(p)] | 12 bytes | 带设定精度的时间段。 | -178000000 年 | 178000000 年 | 1 微秒/14 位 |
INTERVAL YEAR TO MONTH | 12 bytes | 时间段。 | -178000000 年 | 178000000 年 | 1 微秒/14 位 |
TIMESTAMP [(p)] | 8 bytes | 日期和时间的时间戳。 | 4713 BC | 5874897 AD | 1 微秒 |
TIMESTAMP [(p)] WITH TIME ZONE | 8 bytes | 带时区的日期和时间的时间戳。 | 4713 BC | 5874897 AD | 1 微秒 |
TIME [(p)] | 8 bytes | 只用于一日内的时间。 | 00:00:00 | 24:00:00 | 1 毫秒/14 位 |
TIME [(p)] WITH TIME ZONE | 12 bytes | 带时区的只用于一日内的时间。 | 00:00:00+1459 | 24:00:00-1459 | 1 毫秒/14 位 |
当关键字DATE作为列的数据类型在数据定义语言(DDL)命令,如CREATE TABLE或者ALTER TABLE命令中出现的时候,在把数据表定义存储在数据库时,会自动把它转换成TIMESTAMP(0)
类型。因此在日期中带有的时间部分也会随着存储在列中。
当关键字DATE作为变量的数据类型在SPL程序的声明部分出现,或者作为SPL存储过程或SPL函数中形参的数据类型出现,或者作为一个SPL函数返回值类型出现的时候,总是被转换成TIMESTAMP(0)
类型,因此它可以处理出现的时间部分值。
我们可以在TIMESTAMP类型的值上指定一个代表精度的值p,用来指定在秒字段中能够保留的小数位数。参数p的取值范围在0到6之间,缺省值是6。
当TIMESTAMP值以双精度浮点类型值存储的时候(当前是缺省设置),实际精度值的限制可以小于6。在2000-01-01午夜之前或者之后的TIMESTAMP类型值是以秒为单位来存储的。而从日期为2000-01-01向后的几年内,毫秒精度是可以实现的,但是随着日期的延续,精度值就不会这么准确了。当TIMESTAMP值以8字节整数(这是一个编译时的选项)的形式存储的时候,对于所有级别的时间值来说,毫秒级的精度都是有效的。但是8字节整数的TIMESTAMP类型值的日期范围比上面所示的要小些。它的范围是从公元前4713年到公元294276年。
TIMESTAMP (p) WITH TIME ZONE类似于TIMESTAMP (p),但是它也包括时区。
INTERVAL 类型
INTERVAL值指定了一个时间段。类型INTERVAL的值由描述数据值的字段组成。下列表中的字段允许出现在INTERVAL类型中。
字段名 | 取值 |
---|---|
YEAR | 整数值(正或负)。 |
MONTH | 0到11。 |
DAY | 整数值(正或负)。 |
HOUR | 0到23。 |
MINUTE | 0到59。 |
SECOND | 0到59.9(p),其中9(p)是分数秒的精度。 |
这些字段必须以降序的形式呈现,从YEARS到MONTHS,从DAYS到HOURS,从MINUTES再到SECONDS。
PolarDB支持两种与Oracle兼容的INTERVAL类型。
- PolarDB支持的第一种变量为INTERVAL DAY TO SECOND [(p)]。这种变量可存储天、小时、分钟和秒的时间间隔。 说明 p用于指定second字段的精度。PolarDB将下面的值解释为:
INTERVAL '1 2:34:5.678' DAY TO SECOND(3)
1天、2小时、34分钟、5秒和678/1000秒。
INTERVAL '1 23' DAY TO HOUR
1天和23小时。
INTERVAL '2:34' HOUR TO MINUTE
2小时和34分钟。
INTERVAL '2:34:56.129' HOUR TO SECOND(2)
2小时、34分钟、56秒和13/1000秒。说明 因为指定了精度,所以小数点后一位的数四舍五入,从而变为13。
- PolarDB支持的第二种与Oracle兼容的变量为INTERVAL YEAR TO MONTH。这种变量可以存储年和月的时间间隔。 PolarDB将下面的值解释为:
INTERVAL '12-3' YEAR TO MONTH
12年和3个月。
INTERVAL '45' YEAR
45年。
INTERVAL '300' MONTH
25年。
日期和时间的输入
日期和时间输入值一般格式是ISO 8601 SQL兼容格式,Oracle缺省的dd-MON-yy格式,以及其他的一些对年月日有明确的区分的格式。然而避免在格式上出现不明确的最好方法是使用函数TO_DATE。
type 'value' type
- type可以是日期类型,也可以是TIMESTAMP类型。
- value是内容为日期/时间的字符串。
- 日期 下面列出了一些允许使用的日期输入格式,所有这些格式的值都等同于1999年1月8号。
- January 8, 1999
- 1999-01-08
- 1999-Jan-08
- Jan-08-1999
- 08-Jan-1999
- 08-Jan-99
- Jan-08-99
- 19990108
- 990108
我们可以把日期类型值分配给数据类型为DATE或者TIMESTAMP的列或者变量。如果日期类型的值不附带时间类型值,那么小时,分钟和秒数的字段值都是零。
- 时间 在下面的表中显示了一些日期或者时间截类型值中带有时间部分的示例。
示例 描述 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:06America/New_York 用名称声明的时区。 - 时间截
一个有效的时间戳类型输入值是由一个日期和一个时间类型值组成。时间戳中日期部分能够根Table 3-3-6 Date Input显示的示例进行格式化。时间戳中的时间部分可以根据显示的示例进行格式化。
下面这个关于时间戳的示例,使用了Oracle的缺省格式。
08-JAN-99 04:05:06
下面这个关于时间戳的示例,遵循了ISO8601标准的格式。
1999-01-08 04:05:06
日期和时间的输出
日期和时间类型的缺省输出格式既可以是与Oracle兼容,被称为Redwood日期的格式(dd-MON-yy),也可以是根据数据库程序接口而决定的ISO8601格式(yyyy-mm-dd)。使用JDBC进行SQL交互的程序是以ISO8601格式显示日期。其他程序例如PSQL以Redwood格式来显示日期。
格式 | 示例 |
---|---|
Redwood style | 31-DEC-05 07:37:16 |
ISO 8601/SQL standard | 1997-12-17 07:37:16 |
内部格式
对于所有的日期和时间计算,PolarDB都是使用Julian日期进行的。在每年长度为365.2425天的这个假设基础上,Julian日期能够正确的预测和计算从公元前4713年开始之后的任意日期。