PL/SQL - 日期与时间



本章将讨论 PL/SQL 中的日期和时间。PL/SQL 中有两类与日期和时间相关的数据类型:

  • 日期时间数据类型
  • 区间数据类型

日期时间数据类型包括:

  • DATE
  • TIMESTAMP
  • TIMESTAMP WITH TIME ZONE
  • TIMESTAMP WITH LOCAL TIME ZONE

区间数据类型包括:

  • INTERVAL YEAR TO MONTH
  • INTERVAL DAY TO SECOND

日期时间和区间数据类型的字段值

日期时间区间数据类型都包含字段。这些字段的值决定了数据类型的数值。下表列出了日期时间和区间的字段及其可能的值。

字段名称 有效的日期时间值 有效的区间值
YEAR (年) -4712 到 9999(不包括年份 0) 任何非零整数
MONTH (月) 01 到 12 0 到 11
DAY (日) 01 到 31(根据地区日历规则,受 MONTH 和 YEAR 值的限制) 任何非零整数
HOUR (时) 00 到 23 0 到 23
MINUTE (分) 00 到 59 0 到 59
SECOND (秒)

00 到 59.9(n),其中 9(n) 是时间小数秒的精度

DATE 数据类型不适用 9(n) 部分。

0 到 59.9(n),其中 9(n) 是区间小数秒的精度
TIMEZONE_HOUR (时区小时)

-12 到 14(范围包含夏令时变化)

DATE 或 TIMESTAMP 数据类型不适用。

不适用
TIMEZONE_MINUTE (时区分钟)

00 到 59

DATE 或 TIMESTAMP 数据类型不适用。

不适用
TIMEZONE_REGION (时区区域) DATE 或 TIMESTAMP 数据类型不适用。 不适用
TIMEZONE_ABBR (时区缩写) DATE 或 TIMESTAMP 数据类型不适用。 不适用

日期时间数据类型和函数

以下是日期时间数据类型:

DATE

它以字符和数字数据类型存储日期和时间信息。它包含世纪、年份、月份、日期、小时、分钟和秒的信息。它被指定为:

TIMESTAMP

它是 DATE 数据类型的扩展。它存储 DATE 数据类型的年份、月份和日期,以及小时、分钟和秒的值。它用于存储精确的时间值。

TIMESTAMP WITH TIME ZONE

它是 TIMESTAMP 的一个变体,在其值中包含时区区域名称或时区偏移量。时区偏移量是当地时间与 UTC 之间的差异(以小时和分钟表示)。此数据类型对于跨地理区域收集和评估日期信息非常有用。

TIMESTAMP WITH LOCAL TIME ZONE

它是包含时区偏移量的 TIMESTAMP 的另一个变体。

下表提供了日期时间函数(其中,x 具有日期时间值):

序号 函数名称和说明
1

ADD_MONTHS(x, y);

y 个月添加到 x

2

LAST_DAY(x);

返回当月的最后一天。

3

MONTHS_BETWEEN(x, y);

返回 xy 之间的月份数。

4

NEXT_DAY(x, day);

返回 x 之后下一个 day 的日期时间。

5

NEW_TIME;

返回用户指定的时区的时间/日期值。

6

ROUND(x [, unit]);

x 进行四舍五入。

7

SYSDATE();

返回当前日期时间。

8

TRUNC(x [, unit]);

截断 x

时间戳函数(其中,x 具有时间戳值):

序号 函数名称和说明
1

CURRENT_TIMESTAMP();

返回一个包含当前会话时间以及会话时区的 TIMESTAMP WITH TIME ZONE。

2

EXTRACT({ YEAR | MONTH | DAY | HOUR | MINUTE | SECOND } | { TIMEZONE_HOUR | TIMEZONE_MINUTE } | { TIMEZONE_REGION | } TIMEZONE_ABBR ) FROM x)

提取并返回 x 中的年份、月份、日期、小时、分钟、秒或时区。

3

FROM_TZ(x, time_zone);

将 TIMESTAMP x 和 time_zone 指定的时区转换为 TIMESTAMP WITH TIMEZONE。

4

LOCALTIMESTAMP();

返回一个包含会话时区中当地时间的 TIMESTAMP。

5

SYSTIMESTAMP();

返回一个包含当前数据库时间以及数据库时区的 TIMESTAMP WITH TIME ZONE。

6

SYS_EXTRACT_UTC(x);

将 TIMESTAMP WITH TIMEZONE x 转换为包含 UTC 日期和时间的 TIMESTAMP。

7

TO_TIMESTAMP(x, [format]);

将字符串 x 转换为 TIMESTAMP。

8

TO_TIMESTAMP_TZ(x, [format]);

将字符串 x 转换为 TIMESTAMP WITH TIMEZONE。

示例

以下代码片段说明了上述函数的使用:

示例 1

SELECT SYSDATE FROM DUAL; 

输出

08/31/2012 5:25:34 PM 

示例 2

SELECT TO_CHAR(CURRENT_DATE, 'DD-MM-YYYY HH:MI:SS') FROM DUAL; 

输出

31-08-2012 05:26:14

示例 3

SELECT ADD_MONTHS(SYSDATE, 5) FROM DUAL;

输出

01/31/2013 5:26:31 PM 

示例 4

SELECT LOCALTIMESTAMP FROM DUAL; 

输出

8/31/2012 5:26:55.347000 PM 

区间数据类型和函数

以下是区间数据类型:

  • INTERVAL YEAR TO MONTH - 它使用 YEAR 和 MONTH 日期时间字段存储一段时间。

  • INTERVAL DAY TO SECOND - 它使用天、小时、分钟和秒来存储一段时间。

区间函数

序号 函数名称和说明
1

NUMTODSINTERVAL(x, interval_unit);

将数字 x 转换为 INTERVAL DAY TO SECOND。

2

NUMTOYMINTERVAL(x, interval_unit);

将数字 x 转换为 INTERVAL YEAR TO MONTH。

3

TO_DSINTERVAL(x);

将字符串 x 转换为 INTERVAL DAY TO SECOND。

4

TO_YMINTERVAL(x);

将字符串 x 转换为 INTERVAL YEAR TO MONTH。

广告