如果我正確理解你的問題,我的想法是計算之間的秒數明年的第一天,本年度的第一天:
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)
計算數一年中的秒數,然後將該結果乘以小數部分。
對我來說,計算似乎很簡單,只需乘以(365 + isleap)即可。但我很好奇:* where和* why *是數據庫中使用的這種存儲格式? – wallyk
mssql或mysql? –
基本上:'if(isleapyear(...)){days_in_year = 366} else {days_in_year = 365}; @days =(1994.232424 - (int)1994.232424)* @ days_in_year' –