2013-06-04 142 views
0

我試圖通過SSIS派生列轉換將百年日期(HYD)格式轉換爲常規日期格式。例如:將41429 轉換爲06/04/2013。我可以在腳本中使用formatinng代碼來做到這一點(也許我只需要走這條路線),但是覺得必須有一種方法可以在派生列中這樣做,我只是沒有得到。任何幫助表示讚賞。ssis派生列中的百年日期轉換

+0

你可能想澄清HYD格式實際上是,或者至少鏈接到一個有用的網站。谷歌搜索沒有(立即)顯示它是什麼明確的定義。如果你有工作代碼來做,它也會很有用。 – Pondlife

+0

HYD從1/1/1900開始,是從1/1/1900發生到您選擇的任何日期(或系統吐出)的天數。因此HYD的12/31/1900 = 366(一定是閏年),HYD的1/1/1910 = 3654(大約10年* 365加上幾天閏年),HYD爲6/4/2013 = 41429.不幸的是,我們查詢的系統有HYD格式的日期。在腳本中,簡單的答案是這行代碼:格式(DateTime.FromOADate(Row.Date2),「MM/dd/yyyy」)。在不必要的情況下,我儘量避免使用腳本,但它可能是。 –

+0

1900年[不是閏年](http://en.wikipedia.org/wiki/Leap_year#Algorithm),所以實際的開始日期可能是1899-21-31。 – Pondlife

回答

1

這就是我想出的。你確定你的轉換是正確的嗎?我的答案是1天。關閉。

DECLARE @t1 as date = '01/01/1900'; 
DECLARE @t2 as DATE = '12/31/1900'; 
DECLARE @hyd as INT; 

- 該實施例表明,我們需要添加1 SELECT @hyd = DATEDIFF(d,@ T1,T2 @)+ 1 - 364 + 1 SELECT @hyd

set @t2 = '06/04/2013'; 
SELECT @hyd = DATEDIFF (d,@t1, '06/04/2013') + 1-- 41427 
SELECT @hyd 
SELECT DATEADD (d, @hyd, '01-JAN-1900') 

SELECT DATEADD (d, 41429, '01-JAN-1900') 
+0

是的,這是我正在尋找的答案。我不知道爲什麼我沒有想到這一點。謝謝。是的,我實際上從Excel電子表格中的日期轉換爲數字格式。我認爲這是關閉的 - 這更多的是說明HYD的總體思路。 –

+0

很好...請標記爲答案。 –

0

百年日期是根據自1899-12-31以來的天數計算得出的。這是一個「Excel事情」。它也有一個bug,你必須說明。

等效TSQL邏輯將是

DECLARE 
    @HYD int = 41429; 

SELECT 
    @HYD = 
    CASE 
     WHEN @HYD > 60 
      THEN @HYD -1 
     ELSE 
      @HYD  
    END; 

SELECT 
    DATEADD(d, @HYD, '1899-12-31') AS HYD; 

武裝與式,我可以寫在一個派生列轉換下面的表達式(假設有一個名爲HYD列)

(HYD > 60) ? DATEADD("d",HYD - 1,(DT_DATE)"1899-12-31") : DATEADD("d",HYD,(DT_DATE)"1899-12-31") 

enter image description here

而結果

enter image description here

0
--or inline SQL...using this 

SELECT 
case when ([HYD] > 60) then 
    DATEADD(day,[HYD] - 1,'1899-12-31') 
else  
    DATEADD(day,[HYD],'1899-12-31') 
end 'HYD_conv' 
FROM 
    TableName 

--and in the where clause if you like... 

WHERE 
    (case when ([HYD] > 60) then DATEADD(day,[HYD] - 1,'1899-12-31') else  DATEADD(day,[HYD],'1899-12-31') end) = '2016-01-14'