- PL/SQL 教程
- PL/SQL - 首页
- PL/SQL - 概述
- PL/SQL - 环境
- PL/SQL - 基本语法
- PL/SQL - 数据类型
- PL/SQL - 变量
- PL/SQL - 常量和字面量
- PL/SQL - 运算符
- PL/SQL - 条件语句
- PL/SQL - 循环语句
- PL/SQL - 字符串
- PL/SQL - 数组
- PL/SQL - 过程
- PL/SQL - 函数
- PL/SQL - 游标
- PL/SQL - 记录
- PL/SQL - 异常处理
- PL/SQL - 触发器
- PL/SQL - 包
- PL/SQL - 集合
- PL/SQL - 事务
- PL/SQL - 日期与时间
- PL/SQL - DBMS 输出
- PL/SQL - 面向对象
- PL/SQL 有用资源
- PL/SQL - 问答
- PL/SQL - 快速指南
- PL/SQL - 有用资源
- PL/SQL - 讨论
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); 返回 x 和 y 之间的月份数。 |
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。 |