select now(),sysdate(),current_date(),sleep(5),now(),sysdate();
-- will give
-- now() sysdate() current_date() sleep(5) now()1 sysdate()1
-- 6/10/2014 2:50:04 AM 6/10/2014 2:50:04 AM 6/10/2014 12:00:00 AM 0 6/10/2014 2:50:**04** AM 6/10/2014 2:50:**09** AM
explain SELECT DISTINCT e.manager_id, m.manager_name FROM events e JOIN manager m ON m.manager_id = e.manager_id
WHERE m.manager_name != '' AND e.event_when > NOW() - INTERVAL 1 YEAR;
+---------+----------+------------------------------+
| rows | filtered | Extra |
+---------+----------+------------------------------+
| 1333648 | 29.06 | Using where; Using temporary |
| 1 | 90.59 | Using where |
+---------+----------+------------------------------+
您可以看到使用CURRENT_DATE(或CURRENT_TIMESTAMP)大大减少了行数:
explain SELECT DISTINCT e.manager_id, m.manager_name FROM events e JOIN manager m ON m.manager_id = e.manager_id
WHERE m.manager_name != '' AND e.event_when > CURRENT_DATE - INTERVAL 1 YEAR;
+--------+----------+----------------------------------------+
| rows | filtered | Extra |
+--------+----------+----------------------------------------+
| 361470 | 100.00 | Using index condition; Using temporary |
| 1 | 90.59 | Using where |
+--------+----------+----------------------------------------+
7条答案
按热度按时间hfyxw5xn1#
CURRENT_DATE()
:只会给予你日期。NOW()
:给予语句、过程等开始的日期时间。SYSDATE()
:给予你当前的日期时间。使用以下查询查看在
now()1
sysdate()1
之间等待5秒后的秒数(向右滚动):qeeaahzv2#
NOW()
返回一个常量时间,指示语句开始执行的时间。(在存储的函数或触发器中,NOW(
)返回函数或触发语句开始执行的时间。)这与SYSDATE()
的行为不同,SYSDATE()
返回其执行的确切时间。p1tboqfb3#
Current_date返回客户端的时间戳,而sysdate返回服务器的时间戳。如果服务器和客户端都在同一台机器上,那么,两个命令的结果是相同的。但是如果你的服务器在美国,而你的客户端在中国,那么,这两个函数返回完全不同的结果。
我不知道现在的情况(),对不起:-)
bjg7j2ky4#
sysdate()
和now()
之间的一个主要区别最近让我感到困惑。这是它们执行的时间点和频率的差异。sysdate()
在同一条语句中 * 每次 * 都被求值--即在它应用的每一行中。但是now()
只被求值 * 一次,即在查询执行的开始 *。当只有几行时,这种差异并不明显。但是当有数百万行时,这种差异就非常明显了。例如,在RHEL 7中,
sysdate()
显然会进行代价高昂的系统调用,因此当有数百万行时,使用sysdate()
需要一个多小时,而在完全相同的语句中使用now()
只需要几秒钟!这是在精度问题之上的,因为
sysdate()
将返回不同的值,例如,在时间t和时间t+50米利斯之间。关于
curdate()
,我也想知道它与now()
或sysdate()
有什么不同。MySQL参考说,关于何时执行以及执行多少次,curdate()
的行为与now()
相似。参考:MySQL 5.7 Reference - Date and Time Functions--所有上述内容都在本页中进行了描述。但是,它们分散在页面上,因此您必须阅读概述部分以及每个函数的参考。
vybvopom5#
CURRENT_DATE()
是许多其他类似函数的同义词,所有这些函数都只提供日期。official MySQL website页。
jm2pwxwz6#
CURRENT_DATE是静态的,并且与日期索引一起使用效果更好。
NOW()* 似乎 * 是动态的,并没有从索引中受益。(我很想在这里听到关于MySQL内部的更多细节的评论!)
下面是一个使用
NOW()
的真实示例:您可以看到使用
CURRENT_DATE
(或CURRENT_TIMESTAMP
)大大减少了行数:r6l8ljro7#
NOW()返回一个常量时间,表示语句开始执行的时间,而SYSDATE()返回它执行的时间...或者换句话说,NOW()显示查询执行时间,SYSDATE()显示自执行时间。