MySQL 8.4 發行說明
MySQL 支援 TIME
、DATETIME
和 TIMESTAMP
值的小數秒,精度最高可達微秒(6 位數)。
若要定義包含小數秒部分的欄位,請使用語法
,其中type_name
(fsp
)type_name
是TIME
、DATETIME
或TIMESTAMP
,而fsp
是小數秒精度。例如:CREATE TABLE t1 (t TIME(3), dt DATETIME(6));
如果給定,
fsp
值必須在 0 到 6 的範圍內。值 0 表示沒有小數部分。如果省略,則預設精度為 0。(為了與先前的 MySQL 版本相容,這與標準 SQL 的預設值 6 不同。)將具有小數秒部分的
TIME
、DATE
或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 | +-------------+------------------------+------------------------+
接受時間引數的函數會接受具有小數秒的值。時間函數的傳回值會根據需要包含小數秒。例如,沒有引數的
NOW()
會傳回目前日期和時間,沒有小數部分,但會採用從 0 到 6 的選用引數來指定傳回值應包含這麼多位數的小數秒部分。時間常值的語法會產生時間值:
DATE '
、str
'TIME '
和str
'TIMESTAMP '
以及 ODBC 語法等效項。如果指定,結果值會包含尾隨的小數秒部分。先前,時間類型關鍵字被忽略,而這些構造會產生字串值。請參閱標準 SQL 與 ODBC 日期與時間常值str
'