说明 在下面关于日期/时间类型的讨论中,假定无论什么时候创建或修改一张表,配置参edb_redwood_date都是已经设定为true。

POLARDB for Oracle支持在下面表中列出的日期/时间类型。

表 1. Date/Time Types
Name Storage Size Description Low Value High Value Resolution
DATE 8 bytes Date and time 4713 BC 5874897 AD 1 second
INTERVAL DAY TO SECOND [(p)] 12 bytes Period of time -178000000 years 178000000 years 1 microsecond / 14 digits
INTERVAL YEAR TO MONTH 12 bytes Period of time -178000000 years 178000000 years 1 microsecond / 14 digits
TIMESTAMP [(p)] 8 bytes Date and time 4713 BC 5874897 AD 1 microsecond
TIMESTAMP [(p)] WITH TIME ZONE 8 bytes Date and time with time zone 4713 BC 5874897 AD 1 microsecond

当关键字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类型中:

Field Name INTERVAL Values Allowed
YEAR Integer value (positive or negative)
MONTH 0 through 11
DAY Integer value (positive or negative)
HOUR 0 through 23
MINUTE 0 through 59
SECOND 0 through 59.9(p) where 9(p) is the precision of fractional seconds

这些字段必须以降序的形式呈现,从YEARS 到 MONTHS,从 DAYS 到 HOURS,从 MINUTES 再到SECONDS。

POLARDB for Oracle支持两种与Oracle兼容的INTERVAL类型。

  • POLARDB for Oracle支持的第一种变量为INTERVAL DAY TO SECOND [(p)]。 这种变量可存储天、小时、分钟和秒的时间间隔。
    说明 p 用于指定second字段的精度。
    POLARDB for Oracle把下面的值解释为:
    • 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 for Oracle支持的第二种与Oracle兼容的变量为INTERVAL YEAR TO MONTH。这种变量可以存储年和月的时间间隔。
    POLARDB for Oracle把下面的值解释为:
    • INTERVAL '12-3' YEAR TO MONTH

      12年和3个月。

    • INTERVAL '456' YEAR(2)

      12年和3个月。

    • INTERVAL '300' MONTH

      25年。

日期/时间的输入

日期和时间输入值一般格式是ISO 8601 SQL兼容格式,Oracle缺省的dd-MON-yy格式,以及其他的一些对年月日有明确的区分的格式。然而避免在格式上出现不明确的最好方法是使用函数TO_DATE。

任何日期或者时间输入值都需要像文本字符串那样用单引号引起来,我们可以使用下面这种SQL标准语法。
type 'value' type
说明
  • type可以是日期类型,也可以是TIMESTAMP类型。
  • value是内容为日期/时间的字符串。
  • 日期
    下面列出了一些允许使用的日期输入格式,所有这些格式的值都等同于1999年1月8号。
    Example
    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的列或者变量。如果日期类型的值不附带时间类型值,那么小时,分钟和秒数的字段值都是零。

  • 时间
    在下面的表中显示了一些日期或者时间截类型值中带有时间部分的示例。
    表 2. Time Input
    Example Description
    04:05:06.789 ISO 8601
    04:05:06 ISO 8601
    04:05 ISO 8601
    040506 ISO 8601
    04:05 AM Same as 04:05; AM does not affect value
    04:05 PM Same as 16:05; input hour must be <= 12
  • 时间截

    一个有效的时间戳类型输入值是由一个日期和一个时间类型值组成。时间戳中日期部分能够根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这两种风格输出格式的示例。
表 3. Date/Time Output Styles
Description Example
Redwood style 31-DEC-05 07:37:16
ISO 8601/SQL standard 1997-12-17 07:37:16

内部格式

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