Datetime and Interval Data Types

TIMESTAMP WITH TIME ZONE Data Type

TIMESTAMP WITH TIME ZONE是其值TIMESTAMP中包含时区区域名称时区偏移量的变体。时区偏移是本地时间和 UTC(协调世界时 - 以前的格林威治标准时间)之间的差异(以小时和分钟为单位)。此数据类型对于保存本地时区信息很有用。

指定TIMESTAMP WITH TIME ZONE数据类型如下:

TIMESTAMP [( fractional_seconds_precision )] WITH TIME ZONE
TIMESTAMP WITH LOCAL TIME ZONE 数据类型

TIMESTAMP WITH LOCAL TIME ZONE是另一个TIMESTAMP对时区信息敏感的变体。不同之处在于TIMESTAMP WITH TIME ZONE存储在数据库中的数据被规范化为数据库时区,而时区信息不作为列数据的一部分存储。当用户检索数据时,Oracle 会以用户的本地会话时区返回数据。此数据类型对于始终在两层应用程序中以客户端系统的时区显示的日期信息很有用。

指定TIMESTAMP WITH LOCAL TIME ZONE数据类型如下:

TIMESTAMP [(fractional_seconds_precision)] WITH LOCAL TIME ZONE

其中,fractional_seconds_precision可选地指定Oracle在SECOND datetime字段的小数部分中存储的位数。创建此数据类型的列时,该值可以是0到9之间的数字。默认值为6。

INTERVAL YEAR TO MONTH 数据类型

INTERVAL YEAR TO MONTH使用YEAR和MONTH日期时间字段存储时间段。当只有年和月的值很重要时,此数据类型用于表示两个日期时间值之间的差异。

Specify INTERVAL YEAR TO MONTH as follows:

INTERVAL YEAR [(year_precision)] TO MONTH

其中year_precision是year datetime字段中的位数。year_precision的默认值为2。

Specify YEAR TO MONTH interval literals using the following syntax:

 

 

  •  “integer[-integrate]”为文本的前导字段和可选尾随字段指定整数值。如果前导字段为YEAR,尾随字段为MONTH,则月份字段的整数值范围为0到11。
  • precision(精度)是前导字段中的最大位数。前导字段精度的有效范围为0到9,其默认值为2。

对前导字段的限制

如果指定了尾随字段,则其重要性必须小于前导字段。例如,INTERVAL“0-1”MONTH TO YEAR无效。

以下INTERVAL YEAR TO MONTH文字表示123年2个月的间隔:

INTERVAL '123-2' YEAR(3) TO MONTH

下面是其他形式文字的示例,包括一些缩写版本:

Form of Interval LiteralInterpretation

INTERVAL '123-2' YEAR(3) TO MONTH

An interval of 123 years, 2 months. You must specify the leading field precision if it is greater than the default of 2 digits.

INTERVAL '123' YEAR(3)

An interval of 123 years 0 months.

INTERVAL '300' MONTH(3)

An interval of 300 months.

INTERVAL '4' YEAR

Maps to INTERVAL '4-0' YEAR TO MONTH and indicates 4 years.

INTERVAL '50' MONTH

Maps to INTERVAL '4-2' YEAR TO MONTH and indicates 50 months or 4 years 2 months.

INTERVAL '123' YEAR

Returns an error, because the default precision is 2, and '123' has 3 digits.

您可以将一个INTERVAL YEAR TO MONTH文字添加到另一个文字或从中减去,以生成另一个INTERVAL YAER TO MONTH文字。例如:
INTERVAL '5-3' YEAR TO MONTH + INTERVAL'20' MONTH = 
INTERVAL '6-11' YEAR TO MONTH
 
INTERVAL DAY TO SECOND Data Type

INTERVAL DAY TO SECOND以天、小时、分钟和秒的形式存储时间段。此数据类型用于表示两个日期时间值之间的精确差异。

Specify this data type as follows:

INTERVAL DAY [(day_precision)] 
   TO SECOND [(fractional_seconds_precision)]

day_precision是day datetime字段中的位数。接受的值为0到9。默认值为2。

fractional_seconds_precision是SECOND datetime字段小数部分的位数。接受的值为0到9。默认值为6。

 

 

  •  整数指定天数。如果此值包含的数字多于前导精度指定的数字,则Oracle将返回错误。
  • time_expr以格式HH[:MI[:SS[.n]]]或MI[:SS[.n]]或SS[.n]指定时间,其中n指定秒的小数部分。如果n包含的位数超过了fractional_seconds_precision指定的位数,则n将四舍五入为fractional_seconds_precision值指定的位数。仅当前导字段为DAY时,才能在整数和空格后指定time_expr。
  • leading_precision是前导字段中的位数。接受的值为0到9。默认值为2。
  • fractional_seconds_precision是SECOND datetime字段小数部分的位数。接受值为1到9。默认值为6。

 

example:

CREATE TABLE time_table
  (start_time    TIMESTAMP,
   duration_1    INTERVAL DAY (6) TO SECOND (5),
   duration_2    INTERVAL YEAR TO MONTH);

start_time列的类型为TIMESTAMP。TIMESTAMP的隐式小数秒精度为6。

duration_1列的类型为INTERVAL DAY TO SECOND。字段DAY中的最大位数为6,小数秒中的最大数字位数为5。所有其他日期时间字段中的最大数位数为2。

duration_2列的类型为INTERVAL YEAR TO MONTH。每个字段(YEAR和MONTH)中值的最大位数为2。

间隔数据类型没有格式模型。因此,要调整它们的表示方式,必须组合字符函数(如EXTRACT)并连接组件。例如,以下示例查询hr.employees和oe.orders。并将时间间隔输出格式从“yy-mm”更改为“yy-years-mm months”,并从“dd-hh”改为“dd-dd days hh-hours”:

SELECT last_name, EXTRACT(YEAR FROM (SYSDATE - hire_date) YEAR TO MONTH)
       || ' years '
       || EXTRACT(MONTH FROM (SYSDATE - hire_date) YEAR TO MONTH)
       || ' months'  "Interval"
  FROM employees;

LAST_NAME                 Interval
------------------------- --------------------
OConnell                  2 years 3 months
Grant                     1 years 9 months
Whalen                    6 years 1 months
Hartstein                 5 years 8 months
Fay                       4 years 2 months
Mavris                    7 years 4 months
Baer                      7 years 4 months
Higgins                   7 years 4 months
Gietz                     7 years 4 months
. . .

SELECT order_id, EXTRACT(DAY FROM (SYSDATE - order_date) DAY TO SECOND)
       || ' days '
       || EXTRACT(HOUR FROM (SYSDATE - order_date) DAY TO SECOND)
       || ' hours' "Interval"
  FROM orders;

  ORDER_ID Interval
---------- --------------------
      2458 780 days 23 hours
      2397 685 days 22 hours
      2454 733 days 21 hours
      2354 447 days 20 hours
      2358 635 days 20 hours
      2381 508 days 18 hours
      2440 765 days 17 hours
      2357 1365 days 16 hours
      2394 602 days 15 hours
      2435 763 days 15 hours
. . .

 

posted @ 2022-09-20 23:03  wongchaofan  阅读(87)  评论(0编辑  收藏  举报