2012年8月9日 星期四

PHP MySQL 提取未來三十天生日客戶資料(關於跨年取數問題)


最近應上司要求為公司網站的後台加添一個小功能,標示未來三十天生日的客戶並致上祝賀。這個要求不難,我花少少時間便解決。然而因為筆者個性太慎重小心,於是再花時間調試,果然發生不可預料的問題:系統不懂得跨年計算!

平素MySQL內建的 DATE_FORMAT() 或 DAYOFYEAR() 等函式配合 curdate() 都能用作運算天數,如今天為八月九日, date('m-d',strtotime('+30 day')) 即能求出一個月後即九月八日,丟進SQL中要求提取這兩天時間帶以內生日的客戶,本來十分淺顯易懂。然而本人嘗試將Server調為十二月二日以後,這段程序立即失效。貌似MySQL不能理解12-02至01-01,提前為12-01至12-31倒可以提出十二月份生日的紀錄,反之一月也可以,就是十二月至一月是不成功。

網上Google及百度後似乎沒有人提及這個問題,也許沒有人有需要寫這樣的程序www沒辦法君子求諸己,粗粗的隨便寫一支應急,避免年底Bug發生時被上司興師問罪。

<?php
//連接資料庫
include ('admin/mysql_conn.php');
//求取今天日期
$dateST = date('m-d');
//將今天日期累加三十,即為未來一個月
$dateEN = date('m-d',strtotime('+30 day'));
if ($dateST >= '12-02') {
//12-02起跨年計算用的SQL函式
$sql = "SELECT *
FROM customer
WHERE (DATE_FORMAT(birthday,'%m-%d') >= '$dateST' and DATE_FORMAT(birthday,'%m-%d') <= '12-31')
OR (DATE_FORMAT(birthday,'%m-%d') >= '01-01' and DATE_FORMAT(birthday,'%m-%d') <= '$dateEN')";
} else {
//其他正常日子用的SQL函式
$sql = "SELECT *
FROM customer
WHERE DATE_FORMAT(birthday,'%m-%d') >= '$dateST' and DATE_FORMAT(birthday,'%m-%d') <= '$dateEN'";
}
$result = mysql_query($sql, $mysql_conn) or die (mysql_error());
while ($row = mysql_fetch_array($result)) {
echo '<p>'.$row[name].'(ID:'.$row[ID].')&nbsp;Date:'.$row[birthday].'</p>';
}
$total_records = mysql_num_rows($result);
echo '<p>未來三十天內共有&nbsp;'.$total_records.'&nbsp;位客戶生日。</p>';
?>

先後排序、分頁啊甚麼的功能就不列出來,那些大家都懂的就省略吧。實驗調試是成功取出12-31及01-01兩天生日的會員,理論上應該沒有問題就是。本人暫時只想到這個可行方案,如果大家有更好的不妨留言指教,謝謝。

2 則留言:

  1. 直接用timestamp作為判斷的標準也是一種方法。。。。

    回覆刪除
    回覆
    1. 沒辦法,資料庫是舊的,只好靠後天修修補補

      刪除