在我的Oracle數據庫中,我有一個VARCHAR2類型的表中的一列有記入這樣的:甲骨文:將全日的不同的日期格式
Wednesday, August 3, 2016 12:00:00 AM CEST
我想將其轉換爲類似08-03-2016
我試着用TO_DATE跟着TO_CHAR,但是失敗了。一些指導將會有所幫助。
在我的Oracle數據庫中,我有一個VARCHAR2類型的表中的一列有記入這樣的:甲骨文:將全日的不同的日期格式
Wednesday, August 3, 2016 12:00:00 AM CEST
我想將其轉換爲類似08-03-2016
我試着用TO_DATE跟着TO_CHAR,但是失敗了。一些指導將會有所幫助。
一個解決方案是使用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
)
試試這個:
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
因此,它是不平凡的確定正確的時區。
謝謝 - 這也適用! –
除了在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
這工作就像一個魅力。謝謝!如果長日期的價值本身就是日期格式呢? –
取決於你在做什麼,如果你想以特定的格式顯示日期,只需使用to_char轉換爲字符串 –
我試過這樣做,但它似乎並不喜歡它。我只是從雙重做SELECT TO_CHAR(Date_column,'MM-DD-YY'); –