Mysql日期類型大小比較



轉: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()

(完)

發佈了36 篇原創文章 · 獲贊 12 · 訪問量 42萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章