轉:http://www.cnblogs.com/yuxingfirst/archive/2013/03/15/2961233.html
我們知道,mysql裏邊,日期類型有很多表現形式,date, datetime,timestamp等類型。考慮這樣一種場景:
按時間段拉取給定時間段的內容,這時,我們就得使用日期類型的比較了。
表結構: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()
(完)