我试图转换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