我正在尝试转换JDE 日期,并积累了大量信息,并认为我会尝试执行 SQL 转换函数来简化一些任务。
这是我想出的函数,我简称为“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)