Mysql日期類型大小比較---拉取給定時間段的記錄 我們知道,mysql裡邊,日期類型有很多表現形式,date, datetime,timestamp等類型。考慮這樣一種場景: www.2cto.com 按時間段拉取給定時間段的內容,這時,我們就得使用日期類型的比較了。 表結構:tablename_tbl +-----------------+--------------+------+-----+-------------------+----------------+ | Field | Type | Null | Key | Default | Extra | +-----------------+--------------+------+-----+-------------------+----------------+ | id | mediumint(8) | NO | PRI | NULL | auto_increment | | title | varchar(40) | NO | | NULL | | | content | mediumtext | NO | | NULL | | | addtime | timestamp | NO | | CURRENT_TIMESTAMP | | 其中addtime為timestamp類型的,現在我們要拉去過去三小時內新增的記錄,我們可以采取比較unix時間戳以及比較日期這兩種方式實現; 首先看第一種:unix時間戳比較 Mysql內置函數:UNIX_TIMESTAMP() 若無參數調用,則默認返回一個 從 '1970-01-01 00:00:00' 到當前時刻的秒數(無符號整數)。若用date 來調用 unix_timestamp(),它會返回從 '1970-01-01 00:00:00' 到 date表示的時刻為止的秒數;date 可以是一個 date 字符串、一個 datetime字符串、一個 timestamp或一個當地時間的yymmdd 或yyymmdd格式的數字。 則sql語句可以這樣寫: select id,title,content,addtime from tablename_tbl where UNIX_TIMESTAMP(addtime)>= UNIX_TIMESTAMP() - 10800 and UNIX_TIMESTAMP(addtime) <= UNIX_TIMESTAMP() //10800為3小時的秒數。 第二種方式:日期比較 首先看直接使用+-運算: 這種方式中,特別需要注意的是,一個時間日期值加/減一個值的含義。 select now(); +---------------------+ | now() | +---------------------+ | 2013-03-15 13:08:45 | +---------------------+ 通過now函數,我們可以獲取到當前的時間,然後再請看: select now(),now()+1; +---------------------+-----------------------+ | now() | now()+1 | +---------------------+-----------------------+ | 2013-03-15 13:10:15 | 20130315131016.000000 | +---------------------+-----------------------+ select now(),now()-1; +---------------------+-----------------------+ | now() | now()-1 | +---------------------+-----------------------+ | 2013-03-15 13:14:18 | 20130315131417.000000 | +---------------------+-----------------------+ 這兩條語句執行後,第二列表示是在當前時刻加上/減去 一秒,這裡要注意看第二列的表示形式: 20130315131016.000000 (yyyy mm dd HH MM ss.000000)即:在給now()加上或者減去一個值的時候,跟now()的結果的表示形式是不同的,我們再看: select now(),now()-01; +---------------------+-----------------------+ | now() | now()-01 | +---------------------+-----------------------+ | 2013-03-15 13:15:05 | 20130315131504.000000 | +---------------------+-----------------------+ select now(),now()+01; +---------------------+-----------------------+ | now() | now()+01 | +---------------------+-----------------------+ | 2013-03-15 13:15:11 | 20130315131512.000000 | +---------------------+-----------------------+ 看到這裡,很奇怪是不是,怎麼直接在數字前加0也可以執行?加減的難道不是秒數嗎?(我之前就是這樣認為的),執行的結果也是給now()加、減1秒; select now(),now()+101; +---------------------+-----------------------+ | now() | now()+101 | +---------------------+-----------------------+ | 2013-03-15 13:17:14 | 20130315131815.000000 | +---------------------+-----------------------+ select now(),now()-101; +---------------------+-----------------------+ | now() | now()-101 | +---------------------+-----------------------+ | 2013-03-15 13:17:22 | 20130315131621.000000 | +---------------------+-----------------------+ 我們這兩條語句後的執行結果,通過對比兩列,我們可以發現,分別是給now()的時刻加上1分鐘、1秒鐘, 減去1分鐘、1秒鐘;再看個例子 select now(),now()+0101; +---------------------+-----------------------+ | now() | now()+0101 | +---------------------+-----------------------+ | 2013-03-15 13:19:34 | 20130315132035.000000 | +---------------------+-----------------------+ select now(),now()-0101; +---------------------+-----------------------+ | now() | now()-0101 | +---------------------+-----------------------+ | 2013-03-15 13:19:38 | 20130315131837.000000 | +---------------------+-----------------------+ 是不是跟奇怪了,這兩條語句同樣也是給當前時間加/減1分鐘1秒鐘。再看一個結合了年月日的例子: select now(), now()+00010203040506; +---------------------+-----------------------+ | now() | now()+00010203040506 | +---------------------+-----------------------+ | 2013-03-15 13:21:50 | 20140518172656.000000 | +---------------------+-----------------------+ select now(), now()-00010203040506; +---------------------+-----------------------+ | now() | now()-00010203040506 | +---------------------+-----------------------+ | 2013-03-15 13:21:54 | 20120112091648.000000 | +---------------------+-----------------------+ 看到這裡,我們大概就能夠明白了+-的含義了吧;上邊兩條語句是:給當前日期加減:1年2個月3天 4小時5分鐘6秒鐘。 所以,當我們在給now()+-一個時間的時候,其實應該這樣理解的: +1/+01:加1秒鐘 +101/+0101:加1分鐘1秒鐘 +10101/+010101:加1小時1分鐘1秒鐘 +1010101/+01010101:加1天1分鐘1秒鐘 +101010101/+0101010101:加1月1天1分鐘1秒鐘 +1101010101/+010101010101:加1年1月1天1分鐘1秒鐘,這裡要注意下,年這個部分可以是4位(高位沒有的話會補零):00010101010101 (減也是類似的) 所以對於前邊的問題:拉去過去三小時內新增的記錄, 就可以這樣寫sql了: select id,title,content,addtime from tablename_tbl where addtime >= now() - 30000 and addtime <= now() 另外還有一種方式就是使用mysql提供的: date_add(向日期添加指定的時間間隔), DATE_ADD(date,INTERVAL expr type) date 參數是合法的日期表達式。expr 參數是您希望添加的時間間隔。 Type 值 MICROSECOND SECOND MINUTE HOUR DAY WEEK MONTH QUARTER YEAR SECOND_MICROSECOND MINUTE_MICROSECOND MINUTE_SECOND HOUR_MICROSECOND HOUR_SECOND HOUR_MINUTE DAY_MICROSECOND DAY_SECOND DAY_MINUTE DAY_HOUR YEAR_MONTH date_sub(向日期減去指定的時間間隔), DATE_SUB(date,INTERVAL expr type) (使用方法同date_add類似) sql可以這樣寫: select id,title,content,addtime from tablename_tbl where addtime >= date_sub(now, INTERVAL 3 HOUR) AND addtime < now() (完)