2017-04-26 46 views
3

我有一個SSIS包,它將一些數據從Oracle傳輸到SQL Server。CAST vs ssis數據流隱式轉換差異

在Oracle中,日期以浮點形式存儲,例如, 42824 == '2017-04-01' - 使用數據庫的應用程序使用Delphi編寫。

雖然select CAST(42824 as datetime)
在Management Studio導致'2017-04-01 00:00:00.000',由包在SQL Server表插入到日期時間列相同的值(42824)表示2017-03-30 00:00:00.000

注:此號,源數據類型爲DT_R8,在數據轉換成分變更類型DT_UI4改變不了什麼

任何人都可以解釋一下嗎?

回答

0

關於日期連續

存儲在Oracle(42824)的值被稱爲日期序列,它也被用來在Microsoft Excel

日期序列代表天的日期值,這是1899-12-30

您可以瞭解更多關於日期序列號的初始值之間的數字:

CAST方法

Microsoft Docs - CAST and CONVERT (Transact-SQL)

「從字符數據強制轉換爲datetime或smalldatetime時僅支持。當只將表示日期或僅表示時間成分的字符數據轉換爲datetime或smalldatetime數據類型時,未指定的時間成分設置爲00:00:00.000,未指定的日期成分設置爲1900-01-01「

所以CAST功能鑄造日期時,考慮作爲初始值的價值1900-01-01。因此,我們需要。減去2天用它來轉換日期連續劇

有2種方式將其轉換爲日期使用SQL Server時:

select DATEADD(d,42824,'1899-12-30') 

select CAST(36464 - 2 as SmallDateTime) 
根據本 Microsoft docs article

「DBTYPE_DATE

SSIS隱式轉換

另外(這是一個自動化DATE類型。它在內部被表示爲雙..整個部分是自1899年12月30日以來的天數,小數部分是一天中的一小部分。這種類型的精確度爲1秒,因此有效比例爲0。)」

在SSIS所以隱式轉換鑄造日期時,考慮作爲初始值的價值1899-12-30,所以用它來轉換日期連續劇

+0

謝謝您的答覆時,有沒有必要。減去2天。我知道它的區別,事實上我在我的Oracle查詢中寫了 - 2。問題是我最終得到了-4!不知怎的,它看起來像集成服務「知道」這應該像日期和減另一個2.正如我寫的,如果我從管理工作室和SSIS包中明確插入相同的(整數)值到datetime中,我會得到兩個不同的日期。 – avb

+0

在ssis中,如何將整數轉換爲date? – Hadi

+0

明確地說,我不是。我只是將odbc源中的整數列映射到數據流任務中的oledb目標中的datetime列。源SSIS數據類型是DT_R8。 – avb