本文介绍了PolarDB PostgreSQL版(兼容Oracle)支持的日期类型。

说明 在下面关于日期类型的讨论中,假设无论什么时候创建或修改一张表,配置参数polar_comp_redwood_date都已设定为true
名称存储大小描述最小值最大值精度
DATE8 bytes日期和时间。4713 BC5874897 AD1 秒
INTERVAL DAY TO SECOND [(p)]12 bytes带设定精度的时间段。-178000000 年178000000 年1 微秒/14 位
INTERVAL YEAR TO MONTH12 bytes时间段。-178000000 年178000000 年1 微秒/14 位
TIMESTAMP [(p)]8 bytes日期和时间的时间戳。4713 BC5874897 AD1 微秒
TIMESTAMP [(p)] WITH TIME ZONE8 bytes带时区的日期和时间的时间戳。4713 BC5874897 AD1 微秒
TIME [(p)]8 bytes只用于一日内的时间。00:00:0024:00:001 毫秒/14 位
TIME [(p)] WITH TIME ZONE12 bytes带时区的只用于一日内的时间。00:00:00+145924:00:00-14591 毫秒/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整数值(正或负)。
MONTH0到11。
DAY整数值(正或负)。
HOUR0到23。
MINUTE0到59。
SECOND0到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。

任何日期或者时间输入值都需要像文本字符串那样用单引号引起来,我们可以使用下面这种SQL标准语法。
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.789ISO 8601
    04:05:06ISO 8601
    04:05ISO 8601
    040506ISO 8601
    04:05 AM与04:05相同,AM不影响数值。
    04:05 PM与16:05相同,输入小时数必须小于等于12。
    04:05:06.789-8ISO 8601
    04:05:06-08:00ISO 8601
    04:05-08:00ISO 8601
    040506-08ISO 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和ISO8601这两种风格输出格式的示例。
格式示例
Redwood style31-DEC-05 07:37:16
ISO 8601/SQL standard1997-12-17 07:37:16

内部格式

对于所有的日期和时间计算,PolarDB都是使用Julian日期进行的。在每年长度为365.2425天的这个假设基础上,Julian日期能够正确的预测和计算从公元前4713年开始之后的任意日期。