2016-07-28 95 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