YOGO在知識+看到一篇與酷學園相同的問題,分別是 「[php]如何於資料表中到期日前寄出一封信至用戶信箱?」 與 「[求助]如何於資料表中的到期日到時寄出一封信至該用戶信箱?」 ,其中有不少朋友其實已經提出解決之道,只是沒有加以實作而已,有鑑於此YOGO就野人獻曝一下,將之實作出來。
在原始問題中,提問者的原始問題如下:
目前我有做一個客戶資料管理程式,而在這支程式的資料表中我有規劃了用戶的信箱(email)租書到期日(booklimdate)與租片到期日(videolimdate),我想要讓租書到期日與租片到期日前30/15/7/3/1天寄出一封到期通知信給用戶的信箱,【內容比如說:敬愛的顧客xx您好!您向本店租賃的書籍將於$booklimdate到期,敬請注意還書日期,謝謝!! 】請問我該怎麼做呢?
要解決這個問題目前YOGO想的到的方法有2個,一個是用PHP中的date()函式處理,而另一個則是用Mysql的DATE_ADD() 函式來處理,而YOGO的這篇教學是用下Mysql中DATE_ADD()的這個函式來實作,若要用PHP來解決的話,請參考「PHP的日期加減運算」這篇文章,在實作之前我們先來認識一下Mysql中DATE_ADD() 的這個函式,其函式原型如下:
DATE_ADD(date,INTERVAL expr type)
date是一個指定開始日期的DATETIME或DATE值,expr是指定加到開始日期或從開始日期減去的間隔值一個表達式,expr是一個字符串﹔它可以以一個"-"開始表示負間隔。type是一個關鍵詞,指明表達式應該如何被解釋。EXTRACT(type FROM date)函數從日期中返回"type"間隔。下表顯示了type和expr參數怎樣被關聯:
type值 | 含義 | 期望的expr格式 |
SECOND | 秒 | SECONDS |
MINUTE | 分鐘 | MINUTES |
HOUR | 時間 | HOURS |
DAY | 天 | DAYS |
MONTH | 月 | MONTHS |
YEAR | 年 | YEARS |
MINUTE_SECOND | 分鐘和秒 | "MINUTES:SECONDS" |
HOUR_MINUTE | 小時和分鐘 | "HOURS:MINUTES" |
DAY_HOUR | 天和小時 | "DAYS HOURS" |
YEAR_MONTH | 年和月 | "YEARS-MONTHS" |
HOUR_SECOND | 小時, 分鐘, | "HOURS:MINUTES:SECONDS" |
DAY_MINUTE | 天, 小時, 分鐘 | "DAYS HOURS:MINUTES" |
DAY_SECOND | 天, 小時, 分鐘, 秒 | "DAYS HOURS:MINUTES:SECONDS" |
MySQL在expr格式中允許任何標點分隔符。表示顯示的是建議的分隔符。如果date參數是一個DATE值並且你的計算僅僅包含YEAR、MONTH和DAY部分(即,沒有時間部分),結果是一個DATE值。否則結果是一個DATETIME值。
例:
SELECT DATE_ADD("1997-12-31 23:59:59",INTERVAL 1 DAY);
得到的結果如下
1998-01-01 23:59:59
若覺得YOGO這篇文章寫的還不錯的話,就麻煩點一下下方的廣告算是對YOGO一點的小鼓勵吧!!
講解完Mysql的DATE_ADD()函式後,在來就是實作的部份了,首先建立一個名為test的資料表,而這個資料表共有五個欄位,其設定的部份如下:
欄位 | 型態 | 屬性 | Null | 附加 | 欄位說明 |
id | int | UNSIGNED | 是 | auto_increment | 主鍵 |
name | varchar(10) | 是 | 租借人姓名 | ||
e_mail | varchar(100) | 是 | 租借人mail | ||
st_date | date | 是 | 租借時間 | ||
ed_date | date | 是 | 到期日 |
再來分別新增5筆與今天日期(2009-11-11)相隔1天、3天、7天、15天、30天到期日的資料,如下圖所示:
開啟phpmyadmin中的Query window並輸入如下語法:
SELECT * FROM `test` WHERE `ed_date` = DATE_ADD( CURDATE( ) , INTERVAL 1 DAY )
可以看到結果如下:
可以看到已查詢到隔天(1天)到期的租借人資料,再來換到期前3天的的租借人資料,一樣是開啟phpmyadmin中的Query window並輸入如下語法:
SELECT * FROM `test` WHERE `ed_date` = DATE_ADD( CURDATE( ) , INTERVAL 3 DAY )
可以看到結果如下:
可以看到已查詢到3天後到期的租借人資料,再來換到期前7天的的租借人資料,一樣是開啟phpmyadmin中的Query window並輸入如下語法:
SELECT * FROM `test` WHERE `ed_date` = DATE_ADD( CURDATE( ) , INTERVAL 7 DAY )
可以看到結果如下:
可以看到已查詢到7天後到期的租借人資料,再來換到期前15天的的租借人資料,一樣是開啟phpmyadmin中的Query window並輸入如下語法:
SELECT * FROM `test` WHERE `ed_date` = DATE_ADD( CURDATE( ) , INTERVAL 15 DAY )
可以看到結果如下:
可以看到已查詢到15天後到期的租借人資料,再來換到期前30天的的租借人資料,一樣是開啟phpmyadmin中的Query window並輸入如下語法:
SELECT * FROM `test` WHERE `ed_date` = DATE_ADD( CURDATE( ) , INTERVAL 30 DAY )
可以看到結果如下:
可以看到已查詢到30天後到期的租借人資料,且連跨月的部份Mysql都已經幫你算好了,所以不用擔心跨月、閏月之類的問題,因為Mysql中DATE_ADD()函式都會幫你處理。