2016-01-21 147 views
0

我需要您幫助轉換Oracle日期。Oracle - 日期格式

我有一個專門存儲日期這樣的列20150731 00:00:34.220。不過,我想顯示這樣的列像這樣20150731,但是當我運行一個簡單的選擇語句來測試輸出時,我得到以下錯誤。

select TO_DATE('20150731 00:00:34.550','YYYYMMDD') 
from dual 

錯誤

ORA-01830:轉換整個輸入串

+0

嗨 - 列的數據類型是VARCHAR2。 – netraider

+2

「**存儲**這樣的日期......」如果它存儲的數據不是日期列,但是您可能會混淆日期的默認顯示方式以便如何存儲它們 - 哪些不是真正。 Oracle中的實際日期存儲爲代表不同時間單位的整數集。該數值數據通過db默認值或通過to_char()的有意操作轉換爲可讀格式。如果數據存儲爲varchar,那麼請明確說明。 –

+1

然後所有你需要的是** substr(that_column_here,1,8)**除非我錯過了什麼 –

回答

1

此查詢

select TO_DATE('20150731 00:00:34.550','YYYYMMDD') 
from dual 

導致錯誤

ORA-01830:日期格式圖象結束轉換整個輸入串

因爲你傳遞字符串長度22個字符之前,但同時你傳遞8個字符的日期格式,這顯然不符合字符串。你應該寫查詢作爲

select to_timestamp('20150731 00:00:34.550','yyyymmdd hh24:mi:ss.ff3') 
    from dual 

至於你的表,因爲你有varchar2列的日期,你必須要對錶的內容服務。查詢需要執行源字符串和日期格式的匹配。
如果你想顯示不受時間只有日期,你不需要處理此字符串作爲日期,你可以只

select substr('20150731 00:00:34.550', 1, 8) 
    from dual 
0

是正被存儲在Oracle日期時間列之前的日期格式圖象結束?否則,您可能需要進行一些操作才能將其變爲DD-MON-YYYY格式。如果它以文本字符串形式存儲,則可以使用SUBSTR(Date_field, Start_Position, Length)來獲取前8個字符。看看這個鏈接SUBSTR

0

如果列是一個varchar,你需要的日期輸出:

select TO_DATE(substr('20150731 00:00:34.550', 1, 8),'YYYYMMDD') from dual 

如果它的日期格式,你需要一個字符串輸出:

select to_char(your_column, 'YYYYMMDD') from your_table 
1

什麼是列的數據類型?如果它是DATE(因爲它應該是),那麼它不會以您說的格式存儲。它以一種內部二進制格式存儲。您將/應該使用to_char函數以您選擇的任何格式顯示它。如果不使用to_char函數,它將以NLS_DATE_FORMAT指定的格式顯示,格式可以在多個位置指定。

至於你的例子,你傳遞了一個字符串格式的yyyymmd hh:mi:ss.fff',但是你提供了一個只有YYYYMMDD的描述掩碼。它不知道如何處理時間分量。除此之外,當你使用SELECT TO_DATE時,oracle還必須執行暗示TO_CHAR將其轉換回字符串以進行顯示。

另外,您爲to_date提供了一個包含秒的小數部分的字符串。 A DATE數據類型僅解析爲秒。如果您需要小數秒,則需要使用TIMESTAMP,而不是DATE

0

上,你沒有試圖改變該列中的值,而只是試圖證明它在YYYYMMDD格式的假設工作 -

正如a_horse_with_no_name提到的,你只需要轉換它到一個字符串。在這個例子中我用SYSTIMESTAMP作爲我的約會:

SELECT TO_CHAR(systimestamp,'YYYYMMDD') FROM DUAL 

結果:

20160121 

這應該給你你想要顯示的YYYYMMDD格式。