2016-07-28 98 views
0

在我的Oracle数据库中,我有一个VARCHAR2类型的表中的一列有记入这样的:甲骨文:将全日的不同的日期格式

Wednesday, August 3, 2016 12:00:00 AM CEST 

我想将其转换为类似08-03-2016

我试着用TO_DATE跟着TO_CHAR,但是失败了。一些指导将会有所帮助。

回答

1

一个解决方案是使用SUBSTR & INSTR

e.g:

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 
) 
+0

这工作就像一个魅力。谢谢!如果长日期的价值本身就是日期格式呢? –

+0

取决于你在做什么,如果你想以特定的格式显示日期,只需使用to_char转换为字符串 –

+0

我试过这样做,但它似乎并不喜欢它。我只是从双重做SELECT TO_CHAR(Date_column,'MM-DD-YY'); –

1

试试这个:

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; 

RESP。

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 

因此,它是不平凡的确定正确的时区。

+0

谢谢 - 这也适用! –

0

除了在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