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()函式都會幫你處理。



![[試吃分享]團圓招財福神到,「包你發爆米花手工飆香上貢禮 [試吃分享]團圓招財福神到,「包你發爆米花手工飆香上貢禮"](http://a7.sphotos.ak.fbcdn.net/hphotos-ak-ash4/407377_2678731640382_1019006633_2820845_2088867976_n.jpg)






