【问题标题】:Most concise way to convert Julian date (yyyy[day of year]) to SQL datetime将 Julian 日期 (yyyy[day of year]) 转换为 SQL datetime 的最简洁方法
【发布时间】:2010-04-22 15:52:41
【问题描述】:

我正在使用一个现有数据库,其中所有日期都以以下格式存储为整数:yyyy[3 digit day of year]。

例如:

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

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

【问题讨论】:

  • 这种格式有名字吗?还是比 yyyy[3 digit day of year] 更好的引用方式?
  • @Seth Reno:我还以为叫朱利安格式,结果不对。
  • 您可以使用视图、添加计算列或引入过程来处理转换吗?抽象掉丑陋的转换机制,让未来变得非常简洁......
  • @OMG Ponies:你为什么说朱利安不正确?

标签: sql sql-server datetime


【解决方案1】:

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

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

【讨论】:

  • Trixy,第二部分...我喜欢 :)
【解决方案2】:

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

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)

【讨论】:

    猜你喜欢
    • 2016-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-12
    相关资源
    最近更新 更多