【问题标题】:Convert Julian Date to YYYY-MM-DD将儒略日期转换为 YYYY-MM-DD
【发布时间】:2016-02-06 14:58:54
【问题描述】:

我进行了广泛搜索,但似乎找不到将 julian 转换为 yyyy-mm-dd 的方法。

这是我的朱利安的格式:

儒略格式由年份、前两位数字和一年中的日期组成,最后三位数字。

例如,95076March 17, 199595 表示年份和 076 表示今年是第 76 天。

15260

我试过了,但它不起作用:

dateadd(d,(convert(int,LAST_CHANGED_DATE) % 1000)-1, convert(date,(convert(varchar,convert(int,LAST_CHANGED_DATE) /1000 + 1900) + '/1/1'))) as GrgDate

【问题讨论】:

标签: sql sql-server julian-date


【解决方案1】:

您可以使用datepart()选择日期的每一部分

SELECT DATEPART(yy, 95076), DATEPART(dy, 95076)

+++编辑:我误解了一些东西。这是我的更正:+++++

SELECT DATEADD(day, CAST(RIGHT('95076',3) AS int) – 1, CONVERT(datetime,LEFT('95076',2) + '0101', 112))

【讨论】:

    【解决方案2】:

    编辑:将此答案留给 Oracle 和 MySQL 用户
    这在 T-SQL 中不起作用。

    使用这个:

    MAKEDATE(1900 + d / 1000, d % 1000)
    

    例如:

    SELECT MAKEDATE(1900 + 95076 / 1000, 95076 % 1000)
    

    这将返回March, 17 1995 00:00:00

    SQLFiddle

    【讨论】:

    • MAKEDATE() 仅适用于 Oracle 和 MySql。它不是标准的一部分。
    • @JoelCoehoorn 你是对的。我会留在这里,以防有 MySQL 或 Oracle 用户出现。
    【解决方案3】:

    我将 20 连接到我的 JD,然后运行 DATEADD(YEAR, LAST_CHANGE_DATE / 1000 - 1900, LAST_CHANGE_DATE % 1000 - 1)

    这让我得到了结果。谢谢!!!

    【讨论】:

      【解决方案4】:

      SQL 用户 DECLARE @jdate VARCHAR(10) SET @jdate = 117338 SELECT dateadd(dd, (@jdate - ((@jdate/1000) * 1000)) - 1, dateadd(yy, @jdate/1000, 0))

      【讨论】:

        【解决方案5】:

        这绝对适用于所有情况。

        DECLARE @date int
        SET @date = 21319
        SELECT DATEADD(dd, RIGHT(@date,LEN(@date)-3)-1, DATEADD(yy,LEFT(@date,1)*100 +RIGHT(LEFT(@date,3),2),'1 Jan 1900'))
        

        【讨论】:

          【解决方案6】:

          您需要在第一个字符中为世纪指定 1 或 0。例如,SET @date = 21319 应以 1 或 0 为前缀。下面是一个适用于所有 y2k 用例的示例。

          DECLARE @jdate INT 
          SET @jdate = 119150 
          SELECT DATEADD(dd, (@jdate - ((@jdate/1000) * 1000)) - 1, DATEADD(yy, @jdate/1000, 0))
          

          【讨论】:

            【解决方案7】:

            声明@Julian varchar(7)

            声明@date日期

            设置@Julian = 2020277

            设置@Date = Dateadd(day,+ Cast(right(@Julian,3) as int)-1, Cast(left(@Julian,4) + '0101' as Date))

            选择@日期

            【讨论】:

            • 这个问题是四年前回答的。虽然您的答案与接受的答案不同,但非常接近。您能否编辑您的答案以解释为什么这种方法优于已接受的答案?或者,至少,在什么条件下读者可能想要使用你的方法?谢谢。
            【解决方案8】:

            标准 SQL 很简单(您可以对 2 位数年份 YYMMDD 执行类似操作)

            声明@julDate int = 2020275

            Select 
            DateAdd
            (
               day
               , Right(@julDate,3)-1
               , Cast((Left(@julDate,4)+'-01-01') as smalldatetime)
            )
            

            【讨论】:

              【解决方案9】:

              试试这个:

              DECLARE @jdate int
              
              SET @jdate = 21243
              
              select dateadd(dd, (@jdate - ((@jdate/1000) * 1000)) - 1, dateadd(yy, @jdate/1000+100, 0))
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2023-03-26
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多