Oracle中获取系统当前的时间,可以用sysdate、systimestamp等函数,在MySQL中,同样有类似的函数可以使用,碰巧看到eygle大神最近的文章,短短几行文字,就介绍了MySQL中获取系统当前时间的来龙去脉。


在 MySQL 中,获得系统当前时间可以使用now() 函数,这是最简单和应用最广的函数。

除此之外,current_timestamp(),localtime(),localtimestamp()都是now()函数的同义词,返回的结果相同:



mysql> select now();
+---------------------+
| now() |
+---------------------+
| 2019-09-05 12:28:16 |
+---------------------+
1 row in set (0.00 sec)

mysql> select current_timestamp(),localtime(),localtimestamp();
+---------------------+---------------------+---------------------+
| current_timestamp() | localtime() | localtimestamp() |
+---------------------+---------------------+---------------------+
| 2019-09-05 12:30:43 | 2019-09-05 12:30:43 | 2019-09-05 12:30:43 |
+---------------------+---------------------+---------------------+
1 row in set (0.00 sec)



配套的,实现同样效果的同义词还有

current_timestamp,localtime,localtimestamp:



mysql> select current_timestamp,localtime,localtimestamp;
+---------------------+---------------------+---------------------+
| current_timestamp | localtime | localtimestamp |
+---------------------+---------------------+---------------------+
| 2019-09-05 12:30:31 | 2019-09-05 12:30:31 | 2019-09-05 12:30:31 |
+---------------------+---------------------+---------------------+
1 row in set (0.00 sec)



now()函数在一个SQL执行的过程中,取得的是执行开始的时间,并且在执行过程中保持不变,与之相对的则是sysdate()函数,sysdate模拟Oracle数据库的实现,每次执行时,都调用时间函数获得时间,数值每次不同:



mysql> select now(),sysdate(),sleep(3),now(),sysdate() ;
+---------------------+---------------------+----------+---------------------+---------------------+
| now()               | sysdate()           | sleep(3) | now()               | sysdate()           |
+---------------------+---------------------+----------+---------------------+---------------------+
| 2019-09-05 13:34:47 | 2019-09-05 13:34:47 | 0        | 2019-09-05 13:34:47 | 2019-09-05 13:34:50 |
+---------------------+---------------------+----------+---------------------+---------------------+
1 row in set (3.00 sec)



在MySQL的源码中,可以看到这行注释,item_func_sysdate_local模拟了Oracle的行为,每次执行获取当前的真实时间-Real current time,而不是query_start()的时间:

00516 /*

参考:

http://mysql.localhost.net.ar/sources/doxygen/mysql-5.1/item__timefunc_8h-source.html

除了sysdate(),之外,curdate()和curtime()还能够直接将日期和时间拆分开来:



mysql> select curdate(),curtime();
+------------+-----------+
| curdate()  | curtime() |
+------------+-----------+
| 2019-09-05 | 13:37:14 |
+------------+-----------+
1 row in set (0.00 sec)



最后,如果你觉得now()函数就够了,可以在MySQL启动时指定-sysdate-is-now,sysdate()就会被当成now()的一个同义词,按照同样的行为工作了。从中能体会到,MySQL的设计者确实经验丰富,一个小小的时间函数,就可以提供这么多种可选的用途,这些都是值得学习的。