DATE_SUB
DATE_SUB(date,INTERVAL expr unit)
某些 case 需要撈出一個區間來限制行為,例如投票,可能一個 ip 一天只能一票,或者十分鐘只能一票,因此資料庫必須記錄 ip 以及建立的時間,以此 ip 來篩選是否存在於現時限的區間內,若有找到,則予以通知無法投票,實際的做法如下:
$sql = sprintf("SELECT * FROM table WHERE ip = %s AND build_date > DATE_SUB(NOW(), INTERVAL 10 MINUTE)) ,$_SERVER['REMOTE_ADDR']);
我們用了 MySQL 的 function DATE_SUB 來完成篩選的條件,這個 case 是以此 ip 來找出十分鐘內是否有相符的資料,由於 MySQL 官方建議盡量不要運算欄位,所以我們針對 MySQL 內建的函式 NOW() 來加以運算。
DATE_ADD
DATE_ADD(date,INTERVAL expr unit)
DATE_SUB 的兄弟叫 DATE_ADD,是針對日期做相加的動作,以這個例子來舉一反三的話,會變成下面的結果。
$sql = sprintf("SELECT * FROM table WHERE ip = %s AND DTE_ADD(build_date, INTERVAL 10 MINUTE)) > NOW() ,$_SERVER['REMOTE_ADDR']);
當然還是依照建議盡量不要在欄位上做運算。
官方的時間格式表
unit Value | Expected expr Format |
---|---|
MICROSECOND | MICROSECONDS |
SECOND | SECONDS |
MINUTE | MINUTES |
HOUR | HOURS |
DAY | DAYS |
WEEK | WEEKS |
MONTH | MONTHS |
QUARTER | QUARTERS |
YEAR | YEARS |
SECOND_MICROSECOND | 'SECONDS.MICROSECONDS' |
MINUTE_MICROSECOND | 'MINUTES:SECONDS.MICROSECONDS' |
MINUTE_SECOND | 'MINUTES:SECONDS' |
HOUR_MICROSECOND | 'HOURS:MINUTES:SECONDS.MICROSECONDS' |
HOUR_SECOND | 'HOURS:MINUTES:SECONDS' |
HOUR_MINUTE | 'HOURS:MINUTES' |
DAY_MICROSECOND | 'DAYS HOURS:MINUTES:SECONDS.MICROSECONDS' |
DAY_SECOND | 'DAYS HOURS:MINUTES:SECONDS' |
DAY_MINUTE | 'DAYS HOURS:MINUTES' |
DAY_HOUR | 'DAYS HOURS' |
YEAR_MONTH | 'YEARS-MONTHS' |
沒有留言:
張貼留言