1. 程式人生 > 其它 >11.2.6 時間值的小數秒

11.2.6 時間值的小數秒

技術標籤:# MySQL 8.0 參考手冊mysql

官方文件地址:11.2.6 Fractional Seconds in Time Values


MySQL 支援小數秒的 TIME,DATETIME 和 TIMESTAMP 值,最多微秒(6 位)精度:

(1)要定義包含小數秒部分的列,使用語法type_name(fsp),其中type_name是 TIME、DATETIME 或 TIMESTAMP,fsp是小數秒精度。例如:

CREATE TABLE t1 (
  t TIME(3), 
  dt DATETIME(6)
);

如果給定fsp值,必須在 0 到 6 的範圍內。值為 0 表示沒有小數部分。如果省略,預設精度為 0。(這與標準 SQL 預設值 6 不同,以相容以前的 MySQL 版本。)

(2)在相同小數秒精度的列中插入帶有小數部分的 TIME、DATETIME 或 TIMESTAMP 值,精度小於小數部分,會導致舍入。慮如下建立並填充的表:

CREATE TABLE fractest( 
  c1 TIME(2), 
  c2 DATETIME(2), 
  c3 TIMESTAMP(2) 
);
INSERT INTO fractest VALUES
('17:51:04.777', '2018-09-08 17:51:04.777', '2018-09-08 17:51:04.777');

用舍入的方式將時間值插入到表中:

mysql> SELECT * FROM fractest;
+-------------+------------------------+------------------------+ | c1 | c2 | c3 | +-------------+------------------------+------------------------+ | 17:51:04.78 | 2018-09-08 17:51:04.78 | 2018-09-08 17:51:04.78 | +-------------+------------------------+------------------------+

發生這種舍入時不會給出警告或錯誤。此行為遵循 SQL 標準。

要使用截斷插入值,啟用TIME_TRUNCATE_FRACTIONAL SQL 模式:

SET @@sql_mode = sys.list_add(@@sql_mode, 'TIME_TRUNCATE_FRACTIONAL');

啟用該 SQL 模式後,時間值將通過截斷插入:

mysql> SELECT * FROM fractest;
+-------------+------------------------+------------------------+
| c1          | c2                     | c3                     |
+-------------+------------------------+------------------------+
| 17:51:04.77 | 2018-09-08 17:51:04.77 | 2018-09-08 17:51:04.77 |
+-------------+------------------------+------------------------+

(3)接受時間引數的函式接受以秒為單位的值。時間函式的返回值包括小數秒。例如,不帶引數的NOW()返回不帶小數部分的當前日期和時間,但接受一個從 0 到 6 的可選引數,以指定返回值包括的小數部分位數。

(4)時態文字的語法產生時態值:DATE 'str',TIME 'str',和 TIMESTAMP 'str'和 ODBC 語法等價。如果指定了,結果值包括末尾的小數秒部分。在以前,忽略了時態型別關鍵字,這些構造生成了字串值。參見 9.1.3 日期和時間文字 的標準 SQL 和 ODBC 日期和時間文字。