我試圖轉換JDE dates,並且已經積累了大量信息,並想通過嘗試執行SQL轉換函數來簡化某些任務。將JDE Julian日期轉換爲Gregorian
這是我想到了,我只需撥打「ToGregorian」
CREATE FUNCTION [dbo].[ToGregorian](@julian varchar(6))
RETURNS datetime AS BEGIN
DECLARE @datetime datetime
SET @datetime = CAST(19+CAST(SUBSTRING(@julian, 1, 1) as int) as varchar(4))+SUBSTRING(@julian, 2,2)+'-01-01'
SET @datetime = DATEADD(day, CAST(SUBSTRING(@julian, 4,3) as int)-1, @datetime)
RETURN @datetime
END
- 採用「朱利安」字符串的函數。
- 採取第一個字母,並將其添加到世紀,從19日開始。
- 從接下來的2個字符中增加十年和幾年。
- 最後添加天數,這是最後3個字符,並減去1,因爲它已經在第一個設置中有1天。 (如:2011-01-01)
- 結果前:
111186
=>2011-07-05 00:00:00.000
在我看來,這是一個有點笨拙和矯枉過正,而且我希望有這樣做的更好的方法。也許我做了太多的轉換,或者我應該使用不同的方法?
有什麼建議如何改進功能?
也許是另一種更好的方法?
不介意它是否可讀性更好......
我也有一個內聯版本,如果例如我只有閱讀權限並且不能使用函數,凌亂,是否有可能使其更具可讀性,或更好?
CAST(REPLACE(Convert(VARCHAR, DATEADD(d,CAST(SUBSTRING(CAST([column] AS VARCHAR), 4,3) AS INT)-1, CAST(CAST(19+CAST(SUBSTRING(CAST([column] AS VARCHAR), 1,1) AS INT) AS VARCHAR)+SUBSTRING(CAST([column] AS VARCHAR), 2,2) + '-01-01' AS DATETIME)), 111), '/', '-') AS DATETIME)
如果日期是在20世紀,是主角字符0還是字符串5位數字? – 2012-03-12 17:10:06
@AaronBertrand這將是5位數,但我所見到的表中沒有一個日期低於2000年,因爲我公司使用的系統是在2003年左右建立的。它不應該是一個問題,但它提出了一個問題,如果我不得不考慮這個問題,查詢將會有什麼不同? – ShadowScripter 2012-03-12 17:21:02
你應該使用'RIGHT('0'+ column,6)'是安全的,或者添加一個約束來檢查'LEN(column)= 6'和/或'LEFT(column,1)='1'' 。 – 2012-03-12 17:30:55