最简洁的方式将Julian日期(yyyy [day of year])转换为SQL datetime

时间:2010-04-22 15:52:41

标签: sql sql-server datetime

我正在使用现有数据库,其中所有日期都按以下格式存储为整数:yyyy [一年中3位数字]。

例如:

2010-01-01 == 2010001
2010-12-31 == 2010365

我正在使用以下SQL转换为日期时间:

DATEADD(d, 
    CAST(SUBSTRING(
            CAST(NEW_BIZ_OBS_DATE AS VARCHAR), 5, LEN(NEW_BIZ_OBS_DATE) - 4
        ) AS INT) - 1, 
    CAST('1/1/' + SUBSTRING(CAST(NEW_BIZ_OBS_DATE AS VARCHAR),1,4) AS DATETIME))

有没有人有更简洁的方法来做到这一点?

2 个答案:

答案 0 :(得分:2)

你可以用数字代替而不是使用字符串:

dateadd(day, NEW_BIZ_OBS_DATE % 1000 - 1,
  dateadd(year, NEW_BIZ_OBS_DATE / 1000 - 2000, '2000-1-1')
)

(请注意,2010356不是2010-12-31,而是2010-12-22。2010365是2010-12-31。)

答案 1 :(得分:0)

我认为至少可以进行一次简化:

DATEADD(d, 
    NEW_BIZ_OBS_DATE % 1000 - 1, 
    CAST('1/1/' + SUBSTRING(CAST(NEW_BIZ_OBS_DATE AS VARCHAR),1,4) AS DATETIME)
)

我认为第二个术语也可以按照以下方式完成。

    CAST('1/1/' + CAST(NEW_BIZ_OBS_DATE/1000 AS VARCHAR) AS DATETIME)