【问题标题】:Convert 7 digit Julian Date to DateTime in SQL?在 SQL 中将 7 位 Julian Date 转换为 DateTime?
【发布时间】:2015-07-08 01:20:40
【问题描述】:

我在网上看到了很多例子,在 SO 上也看到了一些例子。但是,似乎没有一个适用于我的数据。以下是一些儒略日期及其已知转换值。

JUL | DateTime
2454522 | 2008-02-25 00:00:00.000
2454571 | 2008-04-14 00:00:00.000
2455713 | 2011-05-31 00:00:00.000

我试过这个不起作用:

DECLARE @JD int = 2454522
SELECT DATEADD(YEAR, @JD / 1000 - 1900, @JD % 1000 - 1)

它给了我这个:2455-06-06 00:00:00.000 这显然是错误的。我在这里想念什么?提前致谢。

【问题讨论】:

  • 这适用于哪个 RDBMS?
  • 儒略日期和 YMD 之间的转换并不是那么简单。请参阅 en.wikipedia.org/wiki/Julian_day 以获取解释和计算彼此之间的算法。
  • @DavidAldridge:鉴于使用@ 表示变量名,它看起来像SQLServer。
  • @David 对不起,对于 SQL
  • BBauer42:SQL(结构化查询语言的缩写)是一种用于操作关系数据库管理系统(简称 RDBMS)中保存的数据的语言。有许多 RDBMS(如 Oracle、MySQL、Microsoft SQLServer、PostgreSQL 等),每个都有自己的 SQL 版本。 David 询问使用了其中的哪一个 - 这很重要,因为 SQL 的每种方言都倾向于有自己的处理日期的方式,与其他方言不同。我推断您使用的是 SQLServer - 您能否确认这是否属实,如果不是,您使用的是哪个版本的 SQL?

标签: sql-server julian-date


【解决方案1】:

一种适用于 SQLServer 的方法:

select @jd, dateadd(d,@jd - 2440588,'1970-01-01')

SQLFiddle here.

【讨论】:

    【解决方案2】:

    只要您的 DBMS 支持一组能够计算之间天数的标量函数 两个日期,并且可以在给定日期上添加天数,您需要做的就是计算某种归一化 Julian Dates 的值和做一些相当简单的日期数学。

    在 DB/2 环境中,相关函数是:DAYS 和 DATE。从一些你知道儒略日期的基准日期开始。 例如 2000-01-01 的儒略日期是:2451545。

    接下来使用 DAYS/DATE 标量函数计算同一日期的整数值。在 DB/2 中执行此操作的查询是:

    select days(date('2000-01-01'))
    from sysibm.sysdummy1
    ;
    

    本次查询结果为:730120

    使用这两个值计算儒略日期的归一化因子:2451545 - 730120 = 1721425

    现在您可以从儒略日期计算公历日期,如下所示:

    select date(juliandate - 1721425)
    from sysibm.sysdummy1
    ;
    

    使用您问题中的示例:

    select date(2454522 - 1721425),
           date(2454571 - 1721425),
           date(2455713 - 1721425)
    from sysibm.sysdummy1
    ;
    

    返回以下日期:2008-02-25 2008-04-14 2011-05-31

    您的 DBMS 可能不支持上述示例中使用的特定标量函数,但是,大多数会支持 从公历日期添加一些天数并确定之间天数的某种机制 两个日期。您应该能够使用这些函数和朱利安日期的归一化因子设计一些可行的公式 如上图所示。

    【讨论】:

      【解决方案3】:

      这些是天文儒略日期值,仅限全天。在 SQL Server(当然不能低于 1753 年)中快速而肮脏地转换为 datetime 将是:

      DECLARE @jd as int = 2454522
      SELECT CAST(@jd - 2415021 as datetime)
      
      2008-02-25 00:00:00.000
      

      2415021 来自以下:

      SELECT CAST(0 as datetime)
      
      1900-01-01 00:00:00.000
      

      根据Julian Date converter,1900-01-01 CE 是 2415020.5。加上 0.5,因为 astronomical Julian Date 从中午开始,我们只处理一整天。

      如果你不喜欢脏,试试这个:

      DECLARE @jd as int = 2454522
      SELECT DATEADD(DAY, @jd - 2415021, '1900-01-01')
      
      2008-02-25 00:00:00.000
      

      【讨论】:

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