在SQL中将7位Julian日期转换为DateTime?

时间:2013-04-29 13:08:24

标签: sql-server julian-date

我在网上看过很多例子,有些例子在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这显然是错误的。我在这里错过了什么?谢谢你提前。

3 个答案:

答案 0 :(得分:3)

一种应该在SQLServer中起作用的方法:

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

SQLFiddle here

答案 1 :(得分:1)

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

在DB / 2环境中,相关功能是:DAYS和DATE。从一些基准日期开始,你知道朱利安的日期。 例如,2000-01-01的Julian日期是:2451545。

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

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

此查询的结果是:730120

使用这两个值计算Julian日期的标准化因子:2451545 - 730120 = 1721425

现在您可以从Julian日期计算格里高利日期,如下所示:

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可能不支持上述示例中使用的特定标量函数,但大多数人都会支持 从格里高利日添加一些天数并确定之间的天数的一些机制 两个约会。您应该能够使用这些函数和Julian日期的归一化因子来设计一些可行的公式 如上图所示。

答案 2 :(得分:0)

这些是天文朱利安日期值,仅限整天。 SQL Server中的 datetime 的快速和脏转换(当然不能低于1753年)将是:

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

根据at 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