SELECT
EXTRACT(YEAR FROM TO_DATE('01-JAN-2008 19:15:26',
'DD-MON-YYYY HH24:MI:SS')) AS YEAR,
EXTRACT(MONTH FROM TO_DATE('01-JAN-2008 19:15:26',
'DD-MON-YYYY HH24:MI:SS')) AS MONTH,
EXTRACT(DAY FROM TO_DATE('01-JAN-2008 19:15:26',
'DD-MON-YYYY HH24:MI:SS')) AS DAY
FROM dual;
YEAR MONTH DAY
---------- ---------- ----------
2008 1 1
SELECT
EXTRACT(HOUR FROM TO_TIMESTAMP('01-JAN-2008 19:15:26',
'DD-MON-YYYY HH24:MI:SS')) AS HOUR,
EXTRACT(MINUTE FROM TO_TIMESTAMP('01-JAN-2008 19:15:26',
'DD-MON-YYYY HH24:MI:SS')) AS MINUTE,
EXTRACT(SECOND FROM TO_TIMESTAMP('01-JAN-2008 19:15:26',
'DD-MON-YYYY HH24:MI:SS')) AS SECOND
FROM dual;
HOUR MINUTE SECOND
---------- ---------- ----------
19 15 26
最后这个查询使用EXTRACT函数从由TO_TIMESTAMP_TZ()返回的TIMESTAMP WITH TIMEZONE类型中提取时区的时、分、秒、区域和时区缩写:
SELECT
EXTRACT(TIMEZONE_HOUR FROM TO_TIMESTAMP_TZ(
'01-JAN-2008 19:15:26 -7:15', 'DD-MON-YYYY HH24:MI:SS TZH:TZM'))
AS TZH,
EXTRACT(TIMEZONE_MINUTE FROM TO_TIMESTAMP_TZ(
'01-JAN-2008 19:15:26 -7:15', 'DD-MON-YYYY HH24:MI:SS TZH:TZM'))
AS TZM,
EXTRACT(TIMEZONE_REGION FROM TO_TIMESTAMP_TZ(
'01-JAN-2008 19:15:26 PST', 'DD-MON-YYYY HH24:MI:SS TZR'))
AS TZR,
EXTRACT(TIMEZONE_ABBR FROM TO_TIMESTAMP_TZ(
'01-JAN-2008 19:15:26 PST', 'DD-MON-YYYY HH24:MI:SS TZR'))
AS TZA
FROM dual;
TZH TZM TZR TZA
---------- ---------- ----------- ----------
-7 -15 PST PST
3. FROM_TZ()
FROM_TZ(x, time_zone)将TIMESTAMP类型的x转换为由time_zone指定的时区,并返回TIMESTAMP WITH TIMEZONE类型。time_zone必须被指定为+|- HH:MI格式的字符串。此函数一般将x和time_zone合并成一个值。
SELECT TO_TIMESTAMP('2008-05-13 07:15:31.1234', 'YYYY-MM-DD HH24:MI:SS.FF')
FROM dual;
TO_TIMESTAMP('2008-05-1307:15:31.1234','YYYY-MM-DDHH24:MI:SS.FF')
-----------------------------------------------------------------
13-MAY-08 07.15.31.123400000 AM
6. TO_TIMESTAMP_TZ()
TO_TIMESTAMP_TZ(x,[ format ])用于将字符串x转换为一个TIMESTAMP WITH TIMEZONE类型,该函数中可以为x指定可选的参数format。
下面这个查询向TO_TIMESTAMP_TZ函数传递时区PST(在格式字符串中使用TZR来识别):
SELECT TO_TIMESTAMP_TZ('2008-05-13 07:15:31.1234 PST',
'YYYY-MM-DD HH24:MI:SS.FF TZR')
FROM dual;
TO_TIMESTAMP_TZ('2008-05-1307:15:31.1234PST','YYYY-MM-DDHH24:MI:SS.FFTZR')
--------------------------------------------------------------------------
13-MAY-08 07.15.31.123400000 AM PST
下面这个查询使用与UTC的时差 -7:00(-7:00在格式字符串中用TZR和TZM来识别):
SELECT TO_TIMESTAMP_TZ('2008-05-13 07:15:31.1234 -7:00',
'YYYY-MM-DD HH24:MI:SS.FF TZH:TZM')
FROM dual;
TO_TIMESTAMP_TZ('2008-05-1307:15:31.1234-7:00','YYYY-MM-DDHH24:MI:SS.FFTZH
--------------------------------------------------------------------------
13-MAY-08 07.15.31.123400000 AM -07:00
7. 将字符串转换为TIMESTAMP WITH LOCAL TIME ZONE
使用CAST函数可以将一个字符串转换为TIMESTAMP WITH LOCAL TIME ZONE。第4章曾介绍过CAST(),回想一下,CAST(x AS type)将x转换为由type指定的兼容的数据库类型。
下面这个查询使用CAST()将字符串13-JUN-08转换为TIMESTAMP WITH LOCAL TIME ZONE:
SELECT CAST('13-JUN-08' AS TIMESTAMP WITH LOCAL TIME ZONE)
FROM dual;
CAST('13-JUN-08'ASTIMESTAMPWITHLOCALTIMEZONE)
---------------------------------------------
13-JUN-08 12.00.00.000000 AM
此查询返回的时间戳包含日期2008年6月13日和时间12 A.M.。
下面这个查询使用CAST()将一个更复杂的字符串转换为TIMESTAMP WITH LOCAL TIME ZONE:
SELECT CAST(TO_TIMESTAMP_TZ('2008-05-13 07:15:31.1234 PST',
'YYYY-MM-DD HH24:MI:SS.FF TZR') AS TIMESTAMP WITH LOCAL TIME ZONE)
FROM dual;
CAST(TO_TIMESTAMP_TZ('2008-05-1307:15:31.1234PST','YYYY-MM-DDHH24:MI:SS.FF
--------------------------------------------------------------------------
13-MAY-08 06.15.31.123400 AM
此查询返回的时间戳包含日期2008年5月13日和时间6:15:31.1234 AM PST(PST是数据库时区和会话时区)。
下面这个查询与上面的查询做相同的事情,只是时区是EST:
SELECT CAST(TO_TIMESTAMP_TZ('2008-05-13 07:15:31.1234 EST',
'YYYY-MM-DD HH24:MI:SS.FF TZR') AS TIMESTAMP WITH LOCAL TIME ZONE)
FROM dual;
CAST(TO_TIMESTAMP_TZ('2008-05-1307:15:31.1234EST','YYYY-MM-DDHH24:MI:SS.FF
--------------------------------------------------------------------------
13-MAY-08 04.15.31.123400 AM
此查询返回的时区包含日期2008年3月13日和时间4:15:31.1234 AM PST(因为PST比EST晚3小时,所以此时间戳返回的时间比实际查询的时间早3小时)。