11.2.6 時間值的小數秒
阿新 • • 發佈:2021-02-02
官方文件地址: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 日期和時間文字。