[英]Oracle: Convert Full Date to a Different Date Format
在我的Oracle数据库中,我的表中有一个列为VARCHAR2类型的列,其条目如下:
Wednesday, August 3, 2016 12:00:00 AM CEST
我希望将其转换为08-03-2016
我尝试使用TO_DATE,然后再使用TO_CHAR,但失败。 一些指导会有所帮助。
一种解决方案是使用SUBSTR和INSTR
例如:
SELECT TO_DATE(
SUBSTR(SUBSTR(date_str,1,INSTR(date_str,',',-1)-1),INSTR(SUBSTR(date_str,1,INSTR(date_str,',',-1)-1) ,' ',-1))
|| SUBSTR(date_str,INSTR(date_str,',')+2,3)
|| SUBSTR(date_str,-21,4) ,'DDMONYYYY')
FROM
( SELECT 'Wednesday, August 23, 2016 12:00:00 AM CEST' AS date_str FROM dual )
也许
SELECT TO_DATE(SUBSTR(date_str,1, INSTR(date_str,',',-1)+5) ,'DAY, MONTH DD, YYYY')
FROM (
SELECT 'Wednesday, August 3, 2016 12:00:00 AM CEST' AS date_str FROM dual
)
试试这个:
SELECT
TO_TIMESTAMP(
REGEXP_SUBSTR('Wednesday, August 3, 2016 12:00:00 AM CEST',
'\w+ +\d+, \d{4} \d{2}:\d{2}:\d{2} (A|P)M'),
'fmMonth DD, fmYYYY HH:MI:SS AM')
FROM dual;
分别
SELECT TO_CHAR(
TO_TIMESTAMP(
REGEXP_SUBSTR('Wednesday, August 3, 2016 12:00:00 AM CEST',
'\w+ +\d+, \d{4} \d{2}:\d{2}:\d{2} (A|P)M'),
'fmMonth DD, fmYYYY HH:MI:SS AM'),
'MM-DD-YYYY')
FROM dual;
如果由于CEST
含糊不清,您只需要一天的时间而没有时间的信息,那么您会遇到好运,请参阅以下内容:
SELECT TZABBREV, TZ_OFFSET(TZNAME), TZNAME
FROM V$TIMEZONE_NAMES
WHERE TZABBREV = 'CEST'
ORDER BY 2;
TZABBREV TZ_OFFSET(TZNAME) TZNAME
======== ================== ============
CEST +01:00 Africa/Algiers
CEST +01:00 Europe/Lisbon
CEST +01:00 Portugal
CEST +02:00 Atlantic/Jan_Mayen
CEST +02:00 CET
CEST +02:00 Europe/Amsterdam
CEST +02:00 Europe/Belgrade
CEST +02:00 Europe/Berlin
CEST +02:00 Europe/Bratislava
CEST +02:00 Europe/Brussels
CEST +02:00 Europe/Budapest
CEST +02:00 Europe/Copenhagen
CEST +02:00 Europe/Gibraltar
CEST +02:00 Arctic/Longyearbyen
CEST +02:00 Africa/Tunis
CEST +02:00 Africa/Tripoli
CEST +02:00 Africa/Ceuta
CEST +02:00 Poland
CEST +02:00 Libya
CEST +02:00 Europe/Zurich
CEST +02:00 Europe/Zagreb
CEST +02:00 Europe/Warsaw
CEST +02:00 Europe/Vienna
CEST +02:00 Europe/Vatican
CEST +02:00 Europe/Tirane
CEST +02:00 Europe/Ljubljana
CEST +02:00 Europe/Luxembourg
CEST +02:00 Europe/Madrid
CEST +02:00 Europe/Monaco
CEST +02:00 Europe/Oslo
CEST +02:00 Europe/Paris
CEST +02:00 Europe/Podgorica
CEST +02:00 Europe/Prague
CEST +02:00 Europe/Rome
CEST +02:00 Europe/San_Marino
CEST +02:00 Europe/Sarajevo
CEST +02:00 Europe/Skopje
CEST +02:00 Europe/Stockholm
CEST +03:00 Europe/Zaporozhye
CEST +03:00 Europe/Tallinn
CEST +03:00 Europe/Vilnius
CEST +03:00 Europe/Minsk
CEST +03:00 Europe/Kaliningrad
CEST +03:00 Europe/Sofia
CEST +03:00 Europe/Uzhgorod
CEST +03:00 Europe/Athens
CEST +03:00 Europe/Riga
因此,确定正确的时区并非易事。
有几个单独的问题(除了将带有时区的时间戳存储在VARCHAR2列中之外,这在开始时是错误的)。
一种是CEST没有“预先安装”(至少在我的Oracle安装中没有; CEST无法识别)。 您将不得不依赖特定的时区文件。 为了说明,我将改用EST(美国/东海岸)。
然后,您需要能够将字符串转换为带有时区的时间戳。 您可以这样做:
select to_timestamp_tz('Thursday, July 28, 2016 09:16:15 AM EST',
'Day, Month dd, yyyy, hh:mi:ss AM tzr') as ts from dual;
TS
---------------------------------------
28-JUL-16 09.16.15.000000000 AM EST
此时, TS
是一个时间戳; 屏幕上显示的内容由会话的NLS_TIMESTAMP_TZ_FORMAT
参数决定。 顺便说一句,这假设您的NLS_LANGUAGE
设置为'American'
,否则'Thursday'
的转换将不起作用; 您将需要将nls_param
参数添加到to_timestamp_tz()
。
然后,如果需要将结果显示为'07-28-2016'
,则可以将整个怪物包装在to_char(..., 'mm-dd-yyyy')
。
select to_char(to_timestamp_tz('Thursday, July 28, 2016 09:16:15 AM EST',
'Day, Month dd, yyyy, hh:mi:ss AM tzr'), 'mm-dd-yyyy') as ts from dual;
TS
----------
07-28-2016
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.