2012-03-14 104 views
3

在以下查詢中未考慮閏年。Mysql Dayofyear在閏年

SELECT  e.id, 
      e.title, 
      e.birthdate 
FROM  employers e 
WHERE  DAYOFYEAR(curdate()) <= DAYOFYEAR(e.birthdate) 
AND   DAYOFYEAR(curdate()) +14 >= DAYOFYEAR(e.birthdate) 

所以在此查詢誰是出生在閏年的人的生日得到了在非閏年不同DAYOFYEAR。

我該如何調整查詢以確保它在閏年也有效?

MySQL的版本我已經是:5.0.67

+0

OK,開始還以爲你想要求一個錯誤的'DAYOFYEAR'功能。所以,當然,'DAYOFYEAR'在閏年是不同的。你需要解釋爲什麼這是一個問題。 – Alnitak 2012-03-14 14:01:33

+0

你究竟想用這個查詢來完成什麼? – 2012-03-14 14:03:13

+1

定義作品。當然DayOfYear在閏年是不同的,還有一天。 – 2012-03-14 14:04:03

回答

7

NOW()是一個非閏年2011,從人出生於閏年的2月29日之後,問題就出現了將有一個額外的一天,因爲你正在使用DAYOFYEAR對出生年份。

DAYOFYEAR('2004-04-01') // DAYOFYEAR(e.birthdate) Returns 92 
DAYOFYEAR('2011-04-01') // DAYOFYEAR(NOW()) Returns 91 

你在哪裏做DAYOFYEAR,你需要從當年的生日,而不是出生年份。

因此,而不是:

DAYOFYEAR(e.birthdate) 

你可以把它轉換爲像今年這樣:

DAYOFYEAR(DATE_ADD(e.birthdate, INTERVAL (YEAR(NOW()) - YEAR(e.birthdate)) YEAR)) 

它轉換的生日:

'2004-04-01' 

要:

'2011-04-01' 

所以,這裏是修改後的查詢:

SELECT  e.id, 
      e.title, 
      e.birthdate 
FROM  employers e 
WHERE  DAYOFYEAR(curdate()) <= DAYOFYEAR(DATE_ADD(e.birthdate, INTERVAL (YEAR(NOW()) - YEAR(e.birthday)) YEAR)) 
AND   DAYOFYEAR(curdate()) +14 >= DAYOFYEAR(DATE_ADD(e.birthdate, INTERVAL (YEAR(NOW()) - YEAR(e.birthday)) YEAR)) 

出生於2月29日人們會落在非閏年3月1日,這仍然是60天。

1

有正常年份365天,閏年366。在正常的一年裏,3月1日將是今年的第60天。在閏年中,2月29日將是今年的第60天。 MySQL函數是一致的。

如果你真的想讓它複雜得多,它必須是,你每天可以添加到您的DAYOFYEAR(curdate())如果curdate()大於或等於3月1日curdate()是不是閏年。但我不會推薦這麼做。

+0

我沒有說功能不一致。閱讀我對我的開始帖子的評論! – sanders 2012-03-14 14:14:01