将朱利安日期(yyyy[一年中的某一天])转换为SQL日期时间的最简洁的方法

将朱利安日期(yyyy[一年中的某一天])转换为SQL日期时间的最简洁的方法,sql,sql-server,datetime,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,

我正在使用一个现有的数据库,其中所有日期都以整数的形式存储,格式如下: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))

有没有人有更简洁的方法

我认为至少可以做一个简化:

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)

您可以用数字代替字符串:

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。)

此格式有名称吗?或者是一种比yyyy(一年中的三位数)更好的引用方式?@Seth Reno:我认为它被称为Julian格式,但它不正确。您可以使用视图、添加计算列或引入一个过程来处理转换吗?把丑陋的转换机制抽象出来,让未来变得非常简洁…@Seth:Julian日期格式:@OMG Ponies:你为什么说Julian不正确?Trixy,第二部分。。。我喜欢:)