[Oracle数据库学习]十六、Oracle9i日期函数
D10
可能与最新版本不一致。
时区
全球24个时区
格林威治时间
Oracle9i的日期支持
可以将时区加入日期和时间中,可以精确到秒以下,可以支持夏令时(部分国家有)。
日期中加入的三种新的数据类型:
TIMESTAMP(时间戳)
TIMESTAMP WITH TIME ZONE (TSTZ) (带时区的时间戳)
TIMESTAMP WITH LOCAL TIME ZONE(TSLTZ) (带有本地时区的时间戳)
TZ_OFFSET
显示指定时区与格林威治时间的时差
SELECT TZ_OFFSET('US/Eastern') FROM dual;
TZ_OFFSET('US/EASTERN') |
---|
-04:00 |
设置日期和时间格式:
ALTER SESSION SET NLS_DATE_FORMAT = 'DD-MON-YYYY HH24:MI:SS';
然后查询:
SELECT SESSIONTIMEZONE, CURRENT_DATE FROM DUAL;
SESSIONTIMEZONE | CURRENT_DATE |
---|---|
US/Pacific | 22-JUL-2020 01:57:07 |
修改时区:
ALTER SESSION SET TIME_ZONE = 'Europe/London';
查询:
SELECT SESSIONTIMEZONE, CURRENT_DATE FROM DUAL;
SESSIONTIMEZONE | CURRENT_DATE |
---|---|
Europe/London | 22-JUL-2020 09:57:09 |
D11
CURRENT_DATE
按照当前会话的时区显示当前会话的时间,CURRENT_DATE对会话所在的时区是敏感的。
ALTER SESSION SET NLS_DATE_FORMAT = 'DD-MON-YYYY HH24:MI:SS'; SELECT SESSIONTIMEZONE, CURRENT_DATE FROM DUAL;
SESSIONTIMEZONE | CURRENT_DATE |
---|---|
US/Pacific | 22-JUL-2020 17:43:21 |
ALTER SESSION SET TIME_ZONE = '-5:0'; SELECT SESSIONTIMEZONE, CURRENT_DATE FROM DUAL;
SESSIONTIMEZONE | CURRENT_DATE |
---|---|
-05:00 | 22-JUL-2020 19:43:23 |
ALTER SESSION SET TIME_ZONE = '-8:0'; SELECT SESSIONTIMEZONE, CURRENT_DATE FROM DUAL;
SESSIONTIMEZONE | CURRENT_DATE |
---|---|
-08:00 | 22-JUL-2020 16:46:33 |
注:修改时区后,可以看到当前时间的变化。
CURRENT_TIMESTAMP
按照当前会话的时区显示当前会话的时间,CURRENT_TIMESTAMP 对会话所在的时区是敏感的
返回值是TIMESTAMP WITH TIME ZONE数据类型。
SELECT SESSIONTIMEZONE, CURRENT_TIMESTAMP FROM DUAL;
SESSIONTIMEZONE | CURRENT_TIMESTAMP |
---|---|
US/Pacific | 22-JUL-20 05.48.50.877870 PM US/PACIFIC |
ALTER SESSION SET TIME_ZONE = '-5:0'; SELECT SESSIONTIMEZONE, CURRENT_TIMESTAMP FROM DUAL;
SESSIONTIMEZONE | CURRENT_TIMESTAMP |
---|---|
-05:00 | 22-JUL-20 07.49.48.255795 PM -05:00 |
LOCALTIMESTAMP
按照当前会话的时区显示当前会话的时间,LOCALTIMESTAMP对当前时区是敏感的。
返回TIMESTAMP数据类型。
SELECT CURRENT_TIMESTAMP, LOCALTIMESTAMP FROM DUAL;
CURRENT_TIMESTAMP | LOCALTIMESTAMP |
---|---|
22-JUL-20 05.50.51.362133 PM US/PACIFIC | 22-JUL-20 05.50.51.362133 PM |
ALTER SESSION SET TIME_ZONE = '-5:0'; SELECT CURRENT_TIMESTAMP, LOCALTIMESTAMP FROM DUAL;
CURRENT_TIMESTAMP | LOCALTIMESTAMP |
---|---|
22-JUL-20 07.52.36.887466 PM -05:00 | 22-JUL-20 07.52.36.887466 PM |
DBTIMEZONE
显示数据库所在的时区。
SELECT DBTIMEZONE FROM DUAL;
DBTIMEZONE |
---|
+00:00 |
SESSIONTIMEZONE
显示会话所在的时区。
SELECT SESSIONTIMEZONE FROM DUAL;
SESSIONTIMEZONE |
---|
US/Pacific |
EXTRACT
返回日期/时间的单独部分,比如年、月、日、小时、分钟等等。
从SYSDATE 中抽出年
SELECT EXTRACT (YEAR FROM SYSDATE) FROM DUAL;
EXTRACT(YEARFROMSYSDATE) |
---|
2020 |
从HIRE_DATE 中抽出月
SELECT employee_name, hire_date, EXTRACT (MONTH FROM HIRE_DATE) FROM employees WHERE manager_id = 1;
EMPLOYEE_NAME | HIRE_DATE | EXTRACT(MONTHFROMHIRE_DATE) |
---|---|---|
Bob | 10-MAR-2017 00:00:00 | 3 |
Elsa | 13-NOV-2007 00:00:00 | 11 |
FROM_TZ
可以将一个timstamp和timzone拼成一个timestamp with timezone。
SELECT FROM_TZ(TIMESTAMP '2000-03-28 08:00:00','3:00') FROM DUAL;
FROM_TZ(TIMESTAMP'2000-03-2808:00:00','3:00') |
---|
28-MAR-00 08.00.00.000000 AM +03:00 |
SELECT FROM_TZ(TIMESTAMP '2000-03-28 08:00:00', 'Australia/North') FROM DUAL;
FROM_TZ(TIMESTAMP'2000-03-2808:00:00','AUSTRALIA/NORTH') |
---|
28-MAR-00 08.00.00.000000 AM AUSTRALIA/NORTH |
TO_TIMESTAMP
将BIGINT类型的日期或者VARCHAR类型的日期转换成TIMESTAMP类型。
SELECT TO_TIMESTAMP ('2000-12-01 11:00:00','YYYY-MM-DD HH:MI:SS') FROM DUAL;
TO_TIMESTAMP('2000-12-0111:00:00','YYYY-MM-DDHH:MI:SS') |
---|
01-DEC-00 11.00.00.000000 AM |
TO_TIMESTAMP_TZ
将字符串转换为 TIMESTAMP WITH TIME ZONE 数据类型,包含时区信息。
SELECT TO_TIMESTAMP_TZ('1999-12-01 11:00:00 -8:00','YYYY-MM-DD HH:MI:SS TZH:TZM') FROM DUAL;
TO_TIMESTAMP_TZ('1999-12-0111:00:00-8:00','YYYY-MM-DDHH:MI:SSTZH:TZM') |
---|
01-DEC-99 11.00.00.000000 AM -08:00 |
TO_YMINTERVAL
TO_YMINTERVAL函数将一个CHAR、VARCHAR2、NCHAR 或 NVARCHAR2 数据类型的字符串转换为一个 INTERVAL YEAR TO MONTH 数据类型的值,该函数可以用来对一个日期时间值进行加减计算。
SELECT hire_date, hire_date + TO_YMINTERVAL('01-02') AS HIRE_DATE_YMININTERVAL FROM EMPLOYEES WHERE department_id = 1;
HIRE_DATE | HIRE_DATE_YMININTERVAL |
---|---|
15-NOV-2007 00:00:00 | 15-JAN-2009 00:00:00 |
10-MAR-2017 00:00:00 | 10-MAY-2018 00:00:00 |
注:显示DEPARTMENT_ID为1的员工的雇佣日期1年零2个月后的日期。
总结:
本节介绍日期函数:
TZ_OFFSET:指定时区与格林威治时间的时间差;
FROM_TZ:将一个timstamp和timzone拼成一个timestamp with timezone;
TO_TIMESTAMP:将BIGINT类型的日期或者VARCHAR类型的日期转换成TIMESTAMP类型;
TO_TIMESTAMP_TZ:将字符串转换为 TIMESTAMP WITH TIME ZONE 数据类型,包含时区信息;
TO_YMINTERVEL:将一个CHAR、VARCHAR2、NCHAR 或 NVARCHAR2 数据类型的字符串转换为一个 INTERVAL YEAR TO MONTH 数据类型的值,该函数可以用来对一个日期时间值进行加减计算;
CURRENT_DATE:按照当前会话的时区显示当前会话的时间;
CURRENT_TIMESTAMP:按照当前会话的时区显示当前会话的时间,返回值是TIMESTAMP WITH TIME ZONE数据类型;
LOCALTIMESTAMP:按照当前会话的时区显示当前会话的时间,返回TIMESTAMP数据类型。
DBTIMEZONE:显示数据库所在的时区;
SESSIONTIMEZONE:显示会话所在的时区;
EXTRACT:返回日期/时间的单独部分,比如年、月、日、小时、分钟等等。