標籤:mysql毫秒 mysql微秒
很多從ORACLE 或者 SQL SERVER 移植到 MySQL 的朋友都遇到一個相同的問題,就是關於毫秒的儲存與顯示。 由於MySQL 的只提供了DATETIME, TIMESTAMP, TIME, DATE, YEAR這幾種時間類型,而且DATETIME 以及 TIMESTAMP 的最小單位是秒,沒有儲存毫秒層級的函數。 不過MySQL 卻能識別時間中的毫秒部分。 而且我們有多種方式可以獲得毫秒的部分,比如函數:microsecond 等。
我這裡舉一個簡單的例子,來儲存秒之前和之後的部分。
對於把時間欄位作為主鍵的應用,我們可以建立以下的表來作相應的轉化:
mysql> create table mysql_microsecond ( log_time_prefix timestampnot null default 0, log_time_suffix mediumint not null default 0)engine innnodb;
Query OK, 0 rows affected, 2 warnings (0.00 sec)
mysql> alter table mysql_microsecond add primary key (log_time_prefix, log_time_suffix);
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> set @a = convert(concat(now(),‘.222009‘),datetime);
Query OK, 0 rows affected (0.00 sec)
mysql> insert into mysql_microsecond select date_format(@a,‘%Y-%m-%d %H-%i-%s‘),date_format(@a,‘%f‘);
Query OK, 1 row affected (0.00 sec)
Records: 1 Duplicates: 0 Warnings: 0
mysql> select * from mysql_microsecond;
+---------------------+-----------------+
| log_time_prefix | log_time_suffix |
+---------------------+-----------------+
| 2009-08-11 17:47:02 | 222009 |
+---------------------+-----------------+
1 row in set (0.00 sec)
或者是用VARCHAR來儲存所有的時間欄位, 又或者是儲存一個HASH來保證效能!
方法多多,就看你的應用怎麼用合理了。
MySQL 較新的版本中(MySQL 6.0.5),也還沒有產生微秒的函數,now() 只能精確到秒。 MySQL 中也沒有儲存帶有毫秒、微秒的日期時間類型。
但,奇怪的是 MySQL 已經有抽取(extract)微秒的函數。例如:
select microsecond(‘12:00:00.123456‘); -- 123456select microsecond(‘1997-12-31 23:59:59.000010‘); -- 10
select extract(microsecond from ‘12:00:00.123456‘); -- 123456select 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) 位元組。
毫秒、微秒名詞解釋:
毫秒:millisecond -- 千分之一秒微秒:microsecond -- 一百萬分之一秒1 秒 = 1000 毫秒;1 毫秒 = 1000 微秒
MySQL 關於毫秒和微秒的處理,MySQL擷取毫秒!