2013-04-29 56 views
0

我在网上看到了很多例子,还有一些在这里。但是,我的数据似乎没有任何作用。这里有几个朱利安日期与他们已知的转换值。在SQL中将7位Julian Date转换为DateTime?

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年6月6日00:00:00.000这显然是错误的。我在这里错过了什么?感谢提前。

+0

哪个RDBMS是这个呢? – 2013-04-29 13:14:14

+0

Julian日期和YMD之间的转换并不是那么简单。请参阅http://en.wikipedia.org/wiki/Julian_day获取解释和算法,以便从另一个中计算出一个。 – sizzzzlerz 2013-04-29 13:22:39

+0

@DavidAldridge:由于使用'@'来表示变量名,它看起来像SQLServer。 – 2013-04-29 15:35:20

回答

3

一种方法应该在SQLServer的工作:

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

SQLFiddle here

1

只要您的数据库管理系统支持一些标量函数集,能够计算两个日期之间的天数,并且可以给给定日期添加若干天,那么您所需要做的就是计算某种标准化 Julian Dates的价值和做一些相当简单的日期数学。

在DB/2环境中,相关功能是:DAYS和DATE。从一些你知道Julian的日期开始。 例如,2000-01-01的Julian日期是: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可能不支持在上面的例子中使用的特定标量函数,但是,大多数人会支持 某些机制可以从公历日期中增加一些天数,并确定两个日期之间的天数 。您应该能够使用这些函数和Julian Dates 的规范化因子设计一些可行的公式,如上所示。

0

这些是天文朱利安日期值,仅限整天。快速和肮脏转化为日期时间在SQL Server(这当然不能去一年1753以下的)是:

DECLARE @jd as int = 2454522 
SELECT CAST(@jd - 2415021 as datetime) 

2008-02-25 00:00:00.000 

来自于以下几个:

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 
相关问题