解读mysql时间函数sysdate()和now()

来源:互联网 发布:window.onload 加载js 编辑:程序博客网 时间:2024/06/08 16:42

转自:https://www.2cto.com/database/201211/166264.html


解读mysql时间函数sysdate()和now()

 

NOW() 

  www.2cto.com  

返回当前日期和时间值,其格式为 'YYYY-MM-DD HH:MM:SS' 或YYYYMMDDHHMMSS , 具体格式取决于该函数是否用在字符串中或数字语境中。 

mysql> SELECT NOW(); 

        -> '1997-12-15 23:50:26' 

mysql> SELECT NOW() + 0; 

        -> 19971215235026 

在一个存储程序或触发器内, NOW() 返回一个常数时间,该常数指示了该程序或触发语句开始执行的时间。这同SYSDATE()的运行有所不同。 

 

SYSDATE() 

 

返回当前日期和时间值,格式为'YYYY-MM-DD HH:MM:SS' 或YYYYMMDDHHMMSS, 具体格式根据函数是否用在字符串或数字语境而定。 

在一个存储程序或触发器中, SYSDATE()返回其执行的时间, 而非存储成都或触发语句开始执行的时间。这个NOW()的运作有所不同。 

 

我的理解: 

now()是应用向mysql服务器发起执行语句时(无论是发送的sql还是存储过程的名字),now()时间已经产生。 

调用在该存储过程中或者sql中调用now(),即为调用该变量。 

而sysdate()函数是每次实时去取的 

 

在我们公司的业务中,由于禁止使用存储过程,显然无论使用sysdate()还是now()都能够满足业务需求。当然,考虑到sysdate要实时取时间,我认为now()是比较推荐的. 

 

实践是检验真理的唯一标准: 

1.存储过程: 

BEGIN 

  select now(),sysdate(); 

  select sleep(3) ; 

  select now(),sysdate(); 

END 

执行结果: 

 

mysql> call test; 

+---------------------+---------------------+ 

| now()               | sysdate()           | 

+---------------------+---------------------+ 

| 2011-01-21 11:22:58 | 2011-01-21 11:22:58 | 

+---------------------+---------------------+ 

1 row in set (0.00 sec) 

+----------+ 

| sleep(3) | 

+----------+ 

|        0 | 

+----------+ 

1 row in set (3.00 sec) 

+---------------------+---------------------+ 

| now()               | sysdate()           | 

+---------------------+---------------------+ 

| 2011-01-21 11:23:01 | 2011-01-21 11:23:01 | 

+---------------------+---------------------+ 

1 row in set (3.01 sec) 

Query OK, 0 rows affected (3.01 sec) 

通过如上结果来看,第一个now()跟第二个now()执行结果不一致;对存储过程之内的now()函数,并非取自存储过程执行的开始时间。 

 

2.sql语句测试: 

mysql> select now(),sleep(3),now(); 

+---------------------+----------+---------------------+ 

| now()               | sleep(3) | now()               | 

+---------------------+----------+---------------------+ 

| 2011-01-21 11:25:45 |        0 | 2011-01-21 11:25:45 | 

+---------------------+----------+---------------------+ 

1 row in set (3.00 sec) 

评:now()函数,每次取语句开始的执行时间. 

mysql> select sysdate(),sleep(3),sysdate(); 

+---------------------+----------+---------------------+ 

| sysdate()           | sleep(3) | sysdate()           | 

+---------------------+----------+---------------------+ 

| 2011-01-21 11:26:44 |        0 | 2011-01-21 11:26:47 | 

+---------------------+----------+---------------------+ 

1 row in set (3.02 sec) 

评:sysdate() 每次会取实际的时间。 

 

综合上面的结果: 

1.在公司绝大部分业务中now()函数已经够用,特别是gmt_create,gmt_modified字段的时间,无疑要用now() 

2.sysdate()用在需要每个字段执行的时候实时取时间的。 

3.mysql的字段是从左到右依次执行。


原创粉丝点击