MySQL sysdate()函数
轉載自??MySQL sysdate()函數(shù)
MySQL SYSDATE函數(shù)介紹
下面說明了SYSDATE()函數(shù)的語法:
SYSDATE(fsp);如果函數(shù)用于字符串上下文或YYYYMMDDHHMMSS格式,則SYSDATE()函數(shù)將返回當前日期時間,格式為“YYYY-MM-DD HH:MM:SS”的值,以防在函數(shù)用于數(shù)字上下文。
SYSDATE()函數(shù)接受一個可選參數(shù)fsp,它確定結果是否應該包含從0到6的小數(shù)秒精度。
請參見以下示例 -
mysql> SELECT SYSDATE(); +---------------------+ | SYSDATE() | +---------------------+ | 2017-08-10 20:43:16 | +---------------------+ 1 row in set如果您傳遞fsp參數(shù),則結果將包括小數(shù)秒精度,如以下示例所示:
mysql> SELECT SYSDATE(3); +-------------------------+ | SYSDATE(3) | +-------------------------+ | 2017-08-10 20:43:46.985 | +-------------------------+ 1 row in set?
SYSDATE 與 NOW 比較
請考慮以下示例 -
mysql> SELECT SYSDATE(), NOW(); +---------------------+---------------------+ | SYSDATE() | NOW() | +---------------------+---------------------+ | 2017-08-10 20:44:38 | 2017-08-10 20:44:38 | +---------------------+---------------------+ 1 row in set似乎SYSDATE()和NOW()函數(shù)都返回一個相同的值,它是執(zhí)行語句時當前日期和時間。
然而,SYSDATE()函數(shù)實際上返回執(zhí)行時的時間,而NOW()函數(shù)返回一個常量時間,該語句開始執(zhí)行。
請參閱以下查詢:
mysql> SELECT NOW(), SLEEP(5), NOW(); +---------------------+----------+---------------------+ | NOW() | SLEEP(5) | NOW() | +---------------------+----------+---------------------+ | 2017-08-10 20:46:51 | 0 | 2017-08-10 20:46:51 | +---------------------+----------+---------------------+ 1 row in set在這個例子中,我們使用SLEEP()函數(shù)暫停查詢5秒。 在同一個語句中,NOW()函數(shù)總是返回一個常量,它是語句開始的時間。
我們將NOW()函數(shù)更改為SYSDATE()函數(shù):
mysql> SELECT SYSDATE(), SLEEP(5), SYSDATE(); +---------------------+----------+---------------------+ | SYSDATE() | SLEEP(5) | SYSDATE() | +---------------------+----------+---------------------+ | 2017-08-10 20:48:14 | 0 | 2017-08-10 20:48:19 | +---------------------+----------+---------------------+ 1 row in set在同一個語句中,SYSDATE()函數(shù)返回反映SYSDATE()函數(shù)執(zhí)行時間的不同時間值。
因為SYSDATE()函數(shù)是非確定性的,索引不能用于評估求值引用它的表達式。
為了演示這個,我們創(chuàng)建一個名為tests的表,并將一些數(shù)據(jù)插入到這個表中。
CREATE TABLE tests (id INT AUTO_INCREMENT PRIMARY KEY,t DATETIME UNIQUE );INSERT INTO tests(t) WITH RECURSIVE times(t) AS ( SELECT now() - interval 1 YEAR tUNION ALL SELECT t + interval 1 hourFROM timesWHERE t < now() ) SELECT t FROM times;?
請注意,我們使用遞歸CTE來生成時間序列。 CTE從MySQL 8.0開始才有的功能。
因為t列有唯一索引,所以下列查詢應該執(zhí)行得很快:
SELECT id, t FROMtests WHEREt >= SYSDATE() - INTERVAL 1 DAY;但是,需要15ms才能完成。讓我們使用EXPLAIN語句來看看細節(jié)。
EXPLAIN SELECT id, t FROMtests WHEREt >= SYSDATE() - INTERVAL 1 DAY;執(zhí)行上面分析語句,得到類似以下結果 -
?
原來,MySQL必須掃描表中的所有行才能獲取數(shù)據(jù)。該索引無法使用。
如果在查詢中將SYSDATE()更改為NOW()函數(shù):
SELECT id, t FROMtests WHEREt >= NOW() - INTERVAL 1 DAY;使用NOW()函數(shù),索引已被用于查詢數(shù)據(jù),如下面的EXPLAIN結果所示:
EXPLAIN SELECT id, t FROMtests WHEREt >= NOW() - INTERVAL 1 DAY;?
請注意,MySQL為您提供了--sysdate-is-now選項,可以使SYSDATE()函數(shù)的行為與NOW()函數(shù)相同。
在本教程中,您已經(jīng)了解了MySQL?SYSDATE()函數(shù)以及在使用MySQL之前應該考慮的一些原因。
總結
以上是生活随笔為你收集整理的MySQL sysdate()函数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL str_to_date()函
- 下一篇: SiteGround vs FastCo