2013-03-31 94 views
3

我有一段時間存儲爲分數年,例如。 1994.232424。我需要將這些轉換爲SQL日期時間。MySQL:將分形年份轉換爲DATETIME

訣竅是,分數年是在閏年的不同天數上計算出來的。

我很欣賞一個很好的例子,如何寫下一個SQL表達式將其轉換爲日期,包括閏年條件?自年初以來,我至少需要秒。

閏年條件(MSSQL中,雖然 - 我需要的MySQL選項)將是(根據http://www.c-sharpcorner.com/blogs/8381/leap-year-logics-in-sql-server.aspx

SET @year = 2012 
IF (((@year % 4 = 0) AND (@year % 100 != 0)) OR (@year % 400 = 0)) 
PRINT '1' 
ELSE 
print '0' 
+0

對我來說,計算似乎很簡單,只需乘以(365 + isleap)即可。但我很好奇:* where和* why *是數據庫中使用的這種存儲格式? – wallyk

+0

mssql或mysql? –

+0

基本上:'if(isleapyear(...)){days_in_year = 366} else {days_in_year = 365}; @days =(1994.232424 - (int)1994.232424)* @ days_in_year' –

回答

2

如果我正確理解你的問題,我的想法是計算之間的秒數明年的第一天,本年度的第一天:

SELECT UNIX_TIMESTAMP(MAKEDATE(1994+1,1)) - UNIX_TIMESTAMP(MAKEDATE(1994,1)) 

然後這個數字乘以給定日期的小數部分:

SELECT (UNIX_TIMESTAMP(MAKEDATE(1994+1,1)) - UNIX_TIMESTAMP(MAKEDATE(1994,1))) * 0.232424 

這給出了自年初以來的秒數。然後你可以這個秒數增加了一年的第一天:

SELECT 
    MAKEDATE(1994,1) 
    + INTERVAL (UNIX_TIMESTAMP(MAKEDATE(1994+1,1)) 
      - UNIX_TIMESTAMP(MAKEDATE(1994,1))) * 0.232424 SECOND; 

這是一個通用的查詢:

SET @yourdate = 1994.232424; 

SELECT 
    MAKEDATE(TRUNCATE(@yourdate, 0),1) 
    + INTERVAL (UNIX_TIMESTAMP(MAKEDATE(TRUNCATE(@yourdate, 0)+1,1)) 
      - UNIX_TIMESTAMP(MAKEDATE(TRUNCATE(@yourdate, 0),1))) * 
      (@yourdate-TRUNCATE(@yourdate, 0)) SECOND; 

編輯

我想用UNIX_TIMESTAMP因爲我不想計算一年是不是閏年,我只是希望MySql自動計算它。但還有其他選擇。

如果年份是閏年,一年中的秒數爲31536000 + 86400。

另一個想法是使用MAKEDATE(year, 60)來查看返回的日期是在3月份還是2月份。 MAKEDATE(TRUNCATE(@yourdate, 0),60)=2將被評估爲TRUE(= 1)閏年,併爲FALSE(= 0),否則:

SELECT 
    MAKEDATE(TRUNCATE(@yourdate, 0),1) 
    + INTERVAL (31536000 + (MAKEDATE(TRUNCATE(@yourdate, 0),60)=2)*(86400)) * 
      (@yourdate-TRUNCATE(@yourdate, 0)) SECOND; 

不過,當然,你可以用你的公式:

(31536000 + (((@year % 4 = 0) AND (@year % 100 != 0)) OR (@year % 400 = 0))*86400) 

計算數一年中的秒數,然後將該結果乘以小數部分。

+0

非常感謝!有效。儘管如此,對於小於1970-01-01的日期,它不會返回任何內容,但會返回一年(因爲UNIX_TIMESTAMP在1970年以後不起作用)。也許你還可以建議如何使它適用於所有日期? –

+1

@AskarIbragimov你是對的UNIX_TIMESTAMP計算從1970-01-01開始的秒數,所以它不適用於比這更少的日期,我已經更新了我的答案,我希望現在沒關係 – fthiella