2016-06-13 111 views
0

我在我們的SQL Server 2008數據庫中有以下日期:06-24-1881 00:00:00:000作爲DOB,它的存儲爲datetime格式1800 date in SQL Server&Oracle

我需要將這些數據複製到我們的Oracle 11g數據庫中,並且從我的理解中,Oracle不會將毫秒納入Datetime列。對於1900年以後的數據,我將數據轉換爲smalldatetime,但它對此數據有效,但不會將其轉換爲smalldatetime,因爲它不允許在1/1/1900之前的日期。

如何將多行數據導入到我的Oracle數據庫中?

我嘗試這樣做:

left(DOB, 19) as DOB 

但呈現的數據爲 「1881年6月24日12:00 AM」,所以我試圖插入:

to_date('Jun 24 1881 12:00AM', 'MON-DD-YYYY HH:MI:SSAM') 

而且沒有任何工作。我被卡住了,需要幫助。

+0

你是什麼「提供的日期」是什麼意思?如果您能夠將日期「轉移」到Oracle作爲日期時間,則通過會話NLS_date_format的「呈現」是不相關的,Oracle中的內部(存儲的)日期時間格式是唯一的,它也包含秒數,並且沒有AM後綴;這些僅在顯示日期時添加。 – mathguy

回答

0

Jun 24 1881 12:00AM與Oracle格式字符串MON DD YYYY HH12:MIAM匹配。您的格式掩碼有一個額外的秒數:SS掩碼,Oracle嘗試匹配但未在輸入中找到,因此會拋出ORA-01861: literal does not match format string異常。

所以,如果從SQL Server輸出是該格式隨後在甲骨文你應該能夠做到:

TO_DATE('Jun 24 1881 12:00AM', 'MON DD YYYY HH12:MIAM') 
0

CONVERT(VARCHAR(20),@Date,101) will give you 06/24/1881我正在尋找代碼。

REPLACE(CONVERT(VARCHAR(200),@Date,101),'/','-') + ' 00:00:00:000' 

奇怪我嘗試了一堆與轉換世紀代碼和它的工作對101和其他一些人,但你要失敗的113,而是因爲你沒有幾分鐘,幾小時,秒等,你可以只取101格式並將字符串操作爲你想要的。

DECLARE @Date DATE = '06-24-1881 00:00:00:000' 

    SELECT @Date 
     ,FORMAT(@Date, 'MM-dd-yyyy HH:mm:ss') 
,REPLACE(CONVERT(VARCHAR(200),@Date,101),'/','-') + ' 00:00:00:000' 

注意FORMAT(@Date, 'MM-dd-yyyy HH:mm:ss')是SQL 2012或更新版本,運行良好。