[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;
SESSIONTIMEZONECURRENT_DATE
US/Pacific 22-JUL-2020 01:57:07

修改时区:

ALTER SESSION SET TIME_ZONE = 'Europe/London';

查询:

SELECT SESSIONTIMEZONE, CURRENT_DATE FROM DUAL;
SESSIONTIMEZONECURRENT_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;

 

SESSIONTIMEZONECURRENT_DATE
US/Pacific 22-JUL-2020 17:43:21

 

ALTER SESSION 
SET TIME_ZONE = '-5:0';

SELECT SESSIONTIMEZONE, CURRENT_DATE 
FROM DUAL;
SESSIONTIMEZONECURRENT_DATE
-05:00 22-JUL-2020 19:43:23
ALTER SESSION 
SET TIME_ZONE = '-8:0';

SELECT SESSIONTIMEZONE, CURRENT_DATE 
FROM DUAL;
SESSIONTIMEZONECURRENT_DATE
-08:00 22-JUL-2020 16:46:33

注:修改时区后,可以看到当前时间的变化。

 

CURRENT_TIMESTAMP

按照当前会话的时区显示当前会话的时间,CURRENT_TIMESTAMP 对会话所在的时区是敏感的

返回值是TIMESTAMP WITH TIME ZONE数据类型。

SELECT SESSIONTIMEZONE, CURRENT_TIMESTAMP 
FROM DUAL;
SESSIONTIMEZONECURRENT_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;
SESSIONTIMEZONECURRENT_TIMESTAMP
-05:00 22-JUL-20 07.49.48.255795 PM -05:00

 

LOCALTIMESTAMP

按照当前会话的时区显示当前会话的时间,LOCALTIMESTAMP对当前时区是敏感的。

返回TIMESTAMP数据类型。

SELECT CURRENT_TIMESTAMP, LOCALTIMESTAMP FROM DUAL;
CURRENT_TIMESTAMPLOCALTIMESTAMP
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_TIMESTAMPLOCALTIMESTAMP
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_NAMEHIRE_DATEEXTRACT(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_DATEHIRE_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:返回日期/时间的单独部分,比如年、月、日、小时、分钟等等。

 

posted @ 2020-07-22 17:00  workingdiary  阅读(313)  评论(0)    收藏  举报