2009-06-09 253 views
4

我有一個MySQL member表中的所有生日,與存儲所有成員的出生日期在DATE格式(注意:它有‘年’的一部分)一個DOBSQL,列出在未來和過去14天內

我試圖找到正確的SQL語句:

  • 名單內未來14天內

和另一個查詢到所有生日

  • 名單中前14日內到

直接通過比較當前日期的所有生日:

(DATEDIFF(DOB, now()) <= 14 and DATEDIFF(DOB, now()) >= 0) 

會取什麼,因爲當年和DOB年年人不同。

然而,改造DOB爲「今年將不會在所有的工作,因爲今天可能是1月1日和候選人可能有12月31日(反之亦然)的DOB

這將是巨大的如果你能幫助一下,非常感謝! :)

+2

哇。我認爲這很容易。我修了一下,比乍看起來要困難得多。感謝Code Kata! – Pulsehead 2009-06-09 15:12:41

回答

1

我的第一個想法是使用DAYOFYEAR並採取差異很容易,但實際上在一開始/結束的時候實際上會變得詭計多端。然而:

WHERE 
DAYOFYEAR(NOW()) - DAYOFYEAR(dob) BETWEEN 0 AND 14 
OR DAYOFYEAR(dob) - DAYOFYEAR(NOW()) > 351 

應該工作,取決於你多少關心閏年。 「更好」的答案可能是從dob中提取DAY()和MONTH(),並使用MAKEDATE()在當前(或潛在的過去/下一年)建立一個日期並與之比較。

+0

感謝我要去嘗試:) – Unreality 2009-06-10 17:44:43

0

有很多選擇,我會首先嚐試根據當年和排年之間的年數(即添加他們的年齡)進行轉換。

另一種選擇是在一年內的日數(但您仍然需要擔心翻轉算術或模)。

1

簡單,

我們可以通過這個代碼,獲得更近的生日(即今年的生日):在您的比較

dateadd(year,datediff(year,dob,getdate()),DOB) 

使用本!它會工作。

+0

我仍然不能確定它...心中把它轉換爲MySQL的版本?非常感謝! – Unreality 2009-06-09 15:24:21

+0

你說得對,對不起它,只需鍵入沒有思想,只是習慣了SQL服務器。 DATE_ADD等於SQL Server的DATEADD。是否有一個相當於DATEDIFF在MySQL中,即東西,給我兩個日期的年的距離? – tekBlues 2009-06-09 15:40:16

3

這裏是最簡單的代碼來獲取即將到來的生日爲下一個x天以前x天

這個查詢也不會受到飛躍年

SELECT name, date_of_birty 
FROM users 
WHERE DATE(CONCAT(YEAR(CURDATE()), RIGHT(date_of_birty, 6))) 
      BETWEEN 
       DATE_SUB(CURDATE(), INTERVAL 14 DAY) 
      AND 
       DATE_ADD(CURDATE(), INTERVAL 14 DAY) 
2

@Eli有一個很好的響應,但是硬編碼使得它有點令人困惑,並在閏年期間減少1。

這會檢查生日(dob)是否在未來14天內。首先檢查是否在同一年。第二次檢查是如果它說12月27日,你也想包括Jan日期。

隨着DAYOFYEAR(CONCAT(YEAR(NOW()),'-12-31')),我們在決定是否使用365或366基於當前年份(閏年)。

SELECT dob 
FROM birthdays 
WHERE DAYOFYEAR(dob) - DAYOFYEAR(NOW()) BETWEEN 0 AND 14 
OR 
DAYOFYEAR(CONCAT(YEAR(NOW()),'-12-31')) - (DAYOFYEAR(NOW()) - DAYOFYEAR(dob)) BETWEEN 0 AND 14 
0

這是我30天查詢前檢查:後

select id from users where 
((TO_DAYS(concat(DATE_FORMAT(NOW(),'%Y'), '-', DATE_FORMAT(date_of_birth, '%m-%d')))-TO_DAYS(NOW()))>=-30 
AND (TO_DAYS(concat(DATE_FORMAT(NOW(),'%Y'), '-', DATE_FORMAT(date_of_birth, '%m-%d')))-TO_DAYS(NOW()))<=0) 
OR (TO_DAYS(concat(DATE_FORMAT(NOW(),'%Y'), '-', DATE_FORMAT(date_of_birth, '%m-%d')))-TO_DAYS(NOW()))>=(365-31) 

30天:

select id from users where 
((TO_DAYS(NOW())-TO_DAYS(concat(DATE_FORMAT(NOW(),'%Y'), '-', DATE_FORMAT(date_of_birth, '%m-%d'))))>=-31 
AND (TO_DAYS(NOW())-TO_DAYS(concat(DATE_FORMAT(NOW(),'%Y'), '-', DATE_FORMAT(date_of_birth, '%m-%d'))))<=0) 
OR (TO_DAYS(NOW())-TO_DAYS(concat(DATE_FORMAT(NOW(),'%Y'), '-', DATE_FORMAT(date_of_birth, '%m-%d'))))>=(365-30) 
相關問題