2011/12/26

MySQL 撈取限定時間資料的方法

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'

沒有留言: