代码之家  ›  专栏  ›  技术社区  ›  Seth Reno

将儒略日期(yyyy[一年中的某一天])转换为SQL datetime的最简洁的方法

  •  1
  • Seth Reno  · 技术社区  · 14 年前

    我正在使用一个现有的数据库,其中所有日期都以整数的形式存储,格式如下: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 回复  |  直到 14 年前
        1
  •  2
  •   Guffa    14 年前

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

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

        2
  •  0
  •   DVK    14 年前

    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)