systemadmin.es > DBA > MySQL: SYSDATE() vs NOW()

MySQL: SYSDATE() vs NOW()

En MySQL tenemos dos funciones para obtener la fecha actual que difieren muy ligeramente en su funcionamiento SYSDATE() y NOW(). Comparadas en una misma query aparentemente no tienen ninguna diferencia:

mysql> select sysdate(), now();
+---------------------+---------------------+
| sysdate()           | now()               |
+---------------------+---------------------+
| 2014-07-08 19:07:24 | 2014-07-08 19:07:24 |
+---------------------+---------------------+
1 row in set (0.00 sec)

Pero si las analizamos bien con un SLEEP() en medio podremos ver que su comportamiento difiere, con SYSDATE() obtenemos la fecha en la que se ejecuta dicha función:

mysql> select sysdate(), sleep(5), sysdate();
+---------------------+----------+---------------------+
| sysdate()           | sleep(5) | sysdate()           |
+---------------------+----------+---------------------+
| 2014-07-08 19:08:16 |        0 | 2014-07-08 19:08:21 |
+---------------------+----------+---------------------+
1 row in set (5.00 sec)

En cambio, mediante NOW() obtenemos la fecha en la que se ha ejecutado la query, por lo tanto podemos ver que aun que tengamos un SLEEP() en medio reporta la misma fecha:

mysql> select now(), sleep(5), now();
+---------------------+----------+---------------------+
| now()               | sleep(5) | now()               |
+---------------------+----------+---------------------+
| 2014-07-08 19:08:31 |        0 | 2014-07-08 19:08:31 |
+---------------------+----------+---------------------+
1 row in set (5.00 sec)

La diferencia es más relevante cuando tenemos replicación master-slave en modo statement, podremos apreciar en el log del MySQL un Warning como el siguiente:

140708 19:39:28 [Warning] Statement may not be safe to log in statement format. Statement: UPDATE tabla SET fecha = SYSDATE() WHERE id = '1234'

Evidentemente, el SYSDATE() del slave va a ser diferente del que el del master, por lo que se trata de un comportamiento claramente no determinista.

Mediante la opción sysdate-is-now en el my.cnf podemos hacer que SYSDATE() se comporte como NOW() eliminando dicho comportamiento no determinista:

sysdate-is-now

También podemos pasar a un modo de replicación basado en ROWS o el MIXED para que escoja el MySQL basado en sus propias reglas que método usar.

One comment to “MySQL: SYSDATE() vs NOW()”

  1. Hola… tengo una consulta.. la función NOW () de donde obtiene los datos? Porque quisiera configurarlo.. al guardar en una tabla en el campo de fecha, me deja bien la fecha pero la hora me adelanta en 4 horas.. soy de Paraguay y justamente el horario gmt es (GMT-4). que archivo debo configurar???

Deja un comentario:

XHTML - Tags permitidos:<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>