SQL編程之生日問題
來源:程序員人生 發布時間:2014-11-03 08:22:55 閱讀次數:2621次
在學習MySQL的時候,1個較為經典的SQL編程題目就是生日問題,已知某個用戶的誕生日期和當前日期,計算他最近的生日。
1般需要斟酌兩個問題
例如:某人的生日是1992年2月29日,當前若當前日期是2004年1月2日,那末他的最近生日是2004年2月29日;若當前日期是2004年3月3日,那末他最近的生日則是2005年3月1日。
現在,利用SQL編程解決這個求生日的問題。
創建employees表
Create Table: CREATE TABLE `employees` (
`emp_no` int(11) NOT NULL,
`birth_date` date NOT NULL,
`first_name` varchar(14) NOT NULL,
`last_name` varchar(16) NOT NULL,
`gender` enum('M','F') NOT NULL,
`hire_date` date NOT NULL,
PRIMARY KEY (`emp_no`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
再插入1些數據
INSERT INTO `employees` VALUES ('10001', '1953⑴2⑴2', 'Georgi', 'Facello', 'M', '1986-06⑵6');
INSERT INTO `employees` VALUES ('10002', '1953⑴1⑴1', 'Bezalel', 'Simmel', 'F', '1985⑴1⑵1');
INSERT INTO `employees` VALUES ('10003', '1959⑴2-03', 'Parto', 'Bamford', 'M', '1986-08⑵8');
INSERT INTO `employees` VALUES ('10004', '1954-05-01', 'Chirstian', 'Koblick', 'M', '1986⑴2-01');
INSERT INTO `employees` VALUES ('10005', '1955-01⑵1', 'Kyoichi', 'Maliniak', 'M', '1989-09⑴2');
INSERT INTO `employees` VALUES ('10006', '1953-04⑵0', 'Anneke', 'Preusig', 'F', '1989-06-02');
INSERT INTO `employees` VALUES ('10007', '1957-05⑵3', 'Tzvetan', 'Zielinski', 'F', '1989-02⑴0');
INSERT INTO `employees` VALUES ('10008', '1958-02⑴9', 'Saniya', 'Kalloufi', 'M', '1994-09⑴5');
INSERT INTO `employees` VALUES ('10009', '1952-04⑴9', 'Sumant', 'Peac', 'F', '1985-02⑴8');
INSERT INTO `employees` VALUES ('10010', '1963-06-01', 'Duangkaew', 'Piveteau', 'F', '1989-08⑵4');
INSERT INTO `employees` VALUES ('10011', '1972-02⑵9', 'Jiang', 'David', 'M', '1990-02⑵0');
查看表中現有數據,然后根據誕生日期,和當前日期(2014⑴0⑶1)計算最近生日日期。

編寫SQL,計算最近生日日期
select name,birthday,
if(cur>today,cur,next) as birth_day
from (
select name,birthday,today,
date_add(cur , interval if( day(birthday) = 29 && day(cur) = 28 , 1 , 0 ) day ) as cur,
date_add(next , interval if( day(birthday) = 29 && day(cur) = 28 , 1 , 0 ) day ) as next
from (
select name,birthday,today,
date_add(birthday,interval diff year) as cur,
date_add(birthday,interval diff+1 year) as next
from (
select concat(last_name,' ',first_name) as name,
birth_date as birthday,
( year(now()) - year(birth_date) ) as diff,
now() as today
from employees
) as a
) as b
) as c;
以上這段SQL程序的輸出

分析:
其中使用了3個子查詢a、b、c
a子查詢添加了1個年齡字段diff,用于子查詢b,a的查詢結果以下

子查詢b計算了,今年的生日日期cur和明年的生日日期next,b的查詢結果以下:

注意:這里對閏月的處理是2月28日(依照法律規定,閏年29日的生日在非閏年應當為3月1日),所以子查詢c用于處理閏月的問題,c的查詢結果以下:

最后,需要判斷當前日期是不是大于今年的生日(今年是不是過完了生日),然后選取最近的生日,最后的答案是:

生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈