2013-05-11 177 views
3

我想寫一個查詢MySql數據庫並返回生日日期字段在未來30天內的條目的PHP腳本。我能夠做到這一點,但是我需要在進行查詢時從生日日期中排除年份。例如,如果今天的日期是2013年7月7日,並且所涉及的生日是7/13/1991,顯然這兩個日期相距超過30天,但如果我們排除這一年,它們只相隔3天。使這個有效的生日返回。從當前日期起30天內查詢MySql數據庫的'生日'日期字段

生日字段作爲DATE存儲在MySql數據庫中。

到目前爲止,我所做的查詢:

$results = mysql_query("SELECT * FROM Club WHERE Birthday < DATE_SUB(NOW(), INTERVAL 30 DAY)"); 

我能做些什麼來修改這個查詢不採取今年考慮?

+0

另請參閱http://stackoverflow.com/questions/970615/sql-that-list-all-birthdays-within-the-next-and-previous-14-days?lq=1,http:// stackoverflow .com/questions/3783286 /即將到來的生日-MySQL和php等(雖然沒有標記爲重複,因爲我沒有看到任何好的答案) – 2013-05-11 23:51:10

+0

你的意思是儘管事實上我解決了它一個小時前:> – Drew 2013-05-12 00:22:15

+1

@NSNolan。那是不正確的。看看輸出。它會爲每個人找到他們的下一個生日將會是什麼,並列出他們如果他們在未來30天 – Drew 2013-05-12 00:50:35

回答

1

這是你在找什麼?

SELECT * FROM Club WHERE month(Birthday) = month(DATE_SUB(NOW(), INTERVAL 30 DAY)) and dayofmonth(Birthday) = dayofmonth(DATE_SUB(NOW(), INTERVAL 30 DAY));

http://pastebin.com/uEXrXrHT

+0

你在這個pastebin中有兩個查詢,我假設你指的是第二個? – NSNolan 2013-05-11 21:57:35

+0

我更新了我的答案以反映我所指的查詢。我沒有測試它,但希望它有幫助。 (我沒有將間隔更改爲30天,因此需要更新。) – 2013-05-11 22:04:41

+0

您能解釋一下這是做什麼的。它看起來像檢查是否 1。)生日的月份與當前日期和30天間隔之間的差異的月份相同 和 2.)生日的月份的月份與當前日期之間的差額的月份的月份相同和30天的時間間隔。 我不確定這是否會實際返回正確的結果與我的理解發生了什麼。另外,如果從當前日期扣除30天,是不是查詢過去30天而不是未來30天的生日? – NSNolan 2013-05-12 03:12:18

-1

我沒有測試過,但我認爲這會做,從閱讀很清楚它做什麼。

SELECT * FROM Club WHERE DAYOFYEAR(Birthday) BETWEEN DAYOFYEAR(NOW()) AND DAYOFYEAR(NOW()) + 30; 
+0

這是否適用於閏年?那麼,它不:http://sqlfiddle.com/#!2/d41d8/12197 – CodeZombie 2013-05-11 22:07:01

+1

這取決於你希望它在閏年工作:) – 2013-05-11 22:10:08

+4

這將不會在年底工作。它會在350到15之間表示 – Drew 2013-05-11 22:22:07

1

設置你的窺視,確定他們的下一個出生日期(可以在下一個日曆年),顯示在未來30天有生日的人。工作在一年包裝(在12月)結束,等

http://sqlfiddle.com/#!2/d881b/4

create table peeps 
(id int not null auto_increment, 
    lastname varchar(40) not null, 
birthdate datetime not null, 
primary key (id) 
); 

insert peeps (lastname,birthdate) values ('sam', '1973-01-01'); 
insert peeps (lastname,birthdate) values ('julie', '1973-02-01'); 
insert peeps (lastname,birthdate) values ('kim', '1973-03-01'); 
insert peeps (lastname,birthdate) values ('fred', '1973-04-01'); 
insert peeps (lastname,birthdate) values ('oscar1', '1973-05-01'); 
insert peeps (lastname,birthdate) values ('oscar2', '1973-05-02'); 
insert peeps (lastname,birthdate) values ('oscar3', '1973-05-04'); 
insert peeps (lastname,birthdate) values ('oscar4', '1973-05-06'); 
insert peeps (lastname,birthdate) values ('oscar5', '1973-05-08'); 
insert peeps (lastname,birthdate) values ('oscar6', '1973-05-10'); 
insert peeps (lastname,birthdate) values ('oscar7', '1973-05-12'); 
insert peeps (lastname,birthdate) values ('oscar8', '1973-05-14'); 
insert peeps (lastname,birthdate) values ('oscar9', '1973-05-16'); 
insert peeps (lastname,birthdate) values ('oscar10', '1973-05-18'); 
insert peeps (lastname,birthdate) values ('oscar11', '1973-05-20'); 
insert peeps (lastname,birthdate) values ('oscar12', '1973-05-22'); 
insert peeps (lastname,birthdate) values ('oscar13', '1973-05-24'); 
insert peeps (lastname,birthdate) values ('Felix the Cat1', '1973-06-01'); 
insert peeps (lastname,birthdate) values ('Felix the Cat2', '1973-06-05'); 
insert peeps (lastname,birthdate) values ('Felix the Cat3', '1973-06-07'); 
insert peeps (lastname,birthdate) values ('Bonehead7', '1973-07-01'); 
insert peeps (lastname,birthdate) values ('Bonehead8', '1973-08-01'); 
insert peeps (lastname,birthdate) values ('Bonehead9', '1973-09-01'); 
insert peeps (lastname,birthdate) values ('Bonehead10', '1973-10-01'); 
insert peeps (lastname,birthdate) values ('Bonehead11', '1973-11-01'); 
insert peeps (lastname,birthdate) values ('Bonehead12', '1973-12-01'); 

create table peeps_next_birthday 
(id int not null, 
next_birthdate datetime not null 
); 

insert into peeps_next_birthday (id,next_birthdate) select id,birthdate from peeps; 


UPDATE peeps_next_birthday set next_birthdate=date_add(next_birthdate, interval (year(curdate())-year(next_birthdate)) year); 

update peeps_next_birthday set next_birthdate=date_add(next_birthdate,interval 1 year) 
where curdate()>next_birthdate; 

    /// *************************** now show the birthdays in the coming 30 days 

select t2.id,t2.lastname,t1.next_birthdate 
from peeps_next_birthday t1 
join peeps t2 
on t2.id=t1.id 
where datediff(t1.next_birthdate,curdate())<=30 
+0

+1它的工作原理和索引速度非常快。你可以編輯查詢到你的答案? (在SQLfiddle死亡的情況下)。如果能夠解決這個問題,不用單獨記錄下一個生日,那將會很好。 – 2013-05-12 00:37:36

+0

是的,這只是一個報告表,將被丟棄 – Drew 2013-05-12 00:40:55

0

這是一個有點棘手,但這裏是我的解決方案:

SELECT 
    birthday, 
    -- Shift the birthday into the current year 
    CAST(CONCAT(YEAR(NOW()), '-', MONTH(birthday), '-', DAY(birthday)) AS DATE) AS BirthdayInCurrentYear 
FROM Club 
WHERE CAST(CONCAT(YEAR(NOW()), '-', MONTH(birthday), '-', DAY(birthday)) AS DATE) 
    BETWEEN NOW() AND NOW() + INTERVAL 30 DAY; 

此查詢的工作與閏年,並在下一年的日期。您可以使用我的SQLFiddle進行測試和驗證。

這可能不是最快的解決方案,因爲它會創建一個VARCHAR並將其解析回DATETIME。不幸的是,我沒有找到一個更好的方式,只有一個DATETIME的一年的一部分。

+0

我添加到年份curdate減去他們的出生年份,如果他們的生日在這個日曆年過去了又碰到了另一年 – Drew 2013-05-11 23:58:49

+0

@ ZombieHunter這將在年底失敗 - 在明年初沒有找到生日。 – 2013-05-12 00:00:46

+0

@從那裏所以現在是12月25日你說他不會工作? – Drew 2013-05-12 00:07:46