1. 程式人生 > >mysql 時間型別精確到毫秒、微秒及其處理

mysql 時間型別精確到毫秒、微秒及其處理

一、MySQL 獲得毫秒、微秒及對毫秒、微秒的處理

MySQL 較新的版本中(MySQL 6.0.5),也還沒有產生微秒的函式,now() 只能精確到秒。 MySQL 中也沒有儲存帶有毫秒、微秒的日期時間型別。

但,奇怪的是 MySQL 已經有抽取(extract)微秒的函式。例如:

select microsecond('12:00:00.123456');                          -- 123456
select microsecond('1997-12-31 23:59:59.000010');               -- 10
select extract(microsecond from '12:00:00.123456');             -- 123456
select extract(microsecond from '1997-12-31 23:59:59.000010');  -- 10
select date_format('1997-12-31 23:59:59.000010', '%f');         -- 000010

儘管如此,想在 MySQL 獲得毫秒、微秒還是要在應用層程式中想辦法。假如在應用程式中獲得包含微秒的時間:1997-12-31 23:59:59.000010,在 MySQL 存放時,可以設計兩個欄位:c1 datetime, c2 mediumint,分別存放日期和微秒。為什麼不採用 char 來儲存呢?用 char 型別需要 26 bytes,而 datetime + mediumint 只有 11(8+3) 位元組。

---轉自網友:mlxia

地址:http://mlxia.iteye.com/blog/278982

二、MYSQL的毫秒級時間比較

一般來說,MYSQL使用時間比較一般是轉換成時間格式來比較,如:

DATE_FORMAT('年-月-日 時:分:秒','%Y-%m-%d %h:%i:%s')

select DATE_FORMAT('2010-12-01 07:03:16','%Y-%m-%d %h:%i:%s')/*具體例子*/

如果要轉換成毫秒級就要用 select DATE_FORMAT('2010-12-01 07:03:16.233','%Y-%m-%d %T:%f')-- 注意啦,T不能小寫

一個查詢的例項:

select * from test where DATE_FORMAT(timess,'%Y-%m-%d %T:%f') between DATE_FORMAT('2010-12-01 06:03:16.233','%Y-%m-%d %T:%f') and DATE_FORMAT('2010-12-01 08:03:16.733','%Y-%m-%d %T:%f')

在這裡,要轉換的字串的毫秒前是用“.”表示小數位的。

除此以外,還有一種可以直接拿字串比較的:

select * from test where DATE_FORMAT(timess,'%Y-%m-%d %T:%f') between '2010-12-01 06:03:16:233' and '2010-12-01 08:03:16:733'

這樣也可以。但是要注意這裡的毫秒前的符號變成了":",必須是這個符號,如果你寫成了“.”查詢結果是錯誤的。

其實這2中寫法都可以,不過,我還是建議最好用DATE_FORMA()函式轉換的寫法,因為在使用Navicat Lite這樣的工具除錯的時候,如果是直接比較字串,有時候會報錯。具體原因不明。

最後,還是要跟大家說一聲:在用格式轉換的時候,還是要分清大小寫,因為很多人在這個上面不注意,結果導致除錯失敗。就如同上面的這個例子。不能用小寫的t的格式,還是要用大寫的T,否則結果會錯誤。