2013-04-29 59 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 
相關問題