在本章中,我们将讨论PL/SQL中的日期和时间。 PL/SQL中有两种与日期和时间相关的数据类型 -
- 日期时间数据类型
- 间隔数据类型
日期时间(Datetime)数据类型是 -
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) 是时间小数秒的精确度,9(n) 部分不适用于DATE 。 |
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 。 |
不适用 |
日期时间数据类型和函数
以下是Datetime
数据类型 -
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); |
返回x 和y 之间的月数。 |
4 | NEXT_DAY(x, day); |
返回x 之后的第二天的日期时间。 |
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
SQL> SELECT SYSDATE FROM DUAL;
SYSDATE
--------------
07-11月-17
示例2
SQL> SELECT TO_CHAR(CURRENT_DATE, 'YYYY-MM-DD HH:MI:SS') FROM DUAL;
TO_CHAR(CURRENT_DAT
-------------------
2017-11-07 05:26:07
示例3
SQL> SELECT ADD_MONTHS(SYSDATE, 5) FROM DUAL;
ADD_MONTHS(SYS
--------------
07-4月 -18
示例4
SQL> SELECT LOCALTIMESTAMP FROM DUAL;
LOCALTIMESTAMP
---------------------------------------------------------------------------
07-11月-17 05.27.13.752000 上午
区间数据类型和函数
以下是区间数据类型 -
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 。 |