MySQL
Operaciones de fecha y hora
Buscar..
Ahora()
Select Now();
Muestra la fecha y hora actual del servidor.
Update `footable` set mydatefield = Now();
Esto actualizará el campo mydatefield
con la fecha y hora actuales del servidor en la zona horaria configurada del servidor, por ejemplo
'2016-07-21 12:00:00'
Aritmética de fecha
NOW() + INTERVAL 1 DAY -- This time tomorrow
CURDATE() - INTERVAL 4 DAY -- Midnight 4 mornings ago
Muestre las preguntas de mysql almacenadas que se formularon de 3 a 10 horas (hace 180 a 600 minutos):
SELECT qId,askDate,minuteDiff
FROM
( SELECT qId,askDate,
TIMESTAMPDIFF(MINUTE,askDate,now()) as minuteDiff
FROM questions_mysql
) xDerived
WHERE minuteDiff BETWEEN 180 AND 600
ORDER BY qId DESC
LIMIT 50;
+----------+---------------------+------------+
| qId | askDate | minuteDiff |
+----------+---------------------+------------+
| 38546828 | 2016-07-23 22:06:50 | 182 |
| 38546733 | 2016-07-23 21:53:26 | 195 |
| 38546707 | 2016-07-23 21:48:46 | 200 |
| 38546687 | 2016-07-23 21:45:26 | 203 |
| ... | | |
+----------+---------------------+------------+
Páginas de manual de MySQL para TIMESTAMPDIFF()
.
Cuidado No intente usar expresiones como CURDATE() + 1
para la aritmética de fechas en MySQL. No devuelven lo que usted espera, especialmente si está acostumbrado al producto de base de datos Oracle. Use CURDATE() + INTERVAL 1 DAY
lugar.
Pruebas contra un rango de fechas
Aunque es muy tentador usar BETWEEN
... AND
... para un intervalo de fechas, es problemático. En su lugar, este patrón evita la mayoría de los problemas:
WHERE x >= '2016-02-25'
AND x < '2016-02-25' + INTERVAL 5 DAY
Ventajas:
-
BETWEEN
es "inclusivo", incluida la fecha final o la segunda. -
23:59:59
es torpe e incorrecto si tiene una resolución de microsegundos en unDATETIME
. - Este patrón evita tratar con años bisiestos y otros cálculos de datos.
- Funciona si
x
esDATE
,DATETIME
oTIMESTAMP
.
SYSDATE (), NOW (), CURDATE ()
SELECT SYSDATE();
Esta función devuelve la fecha y la hora actuales como un valor en 'YYYY-MM-DD HH:MM:SS'
o YYYYMMDDHHMMSS
, dependiendo de si la función se usa en una cadena o contexto numérico. Devuelve la fecha y la hora en la zona horaria actual.
SELECT NOW();
Esta función es un sinónimo de SYSDATE()
.
SELECT CURDATE();
Esta función devuelve la fecha actual, sin ningún tiempo, como un valor en 'YYYY-MM-DD'
o YYYYMMDD
, dependiendo de si la función se usa en una cadena o contexto numérico. Devuelve la fecha en la zona horaria actual.
Extraer la fecha de la fecha dada o la expresión de fecha y hora
SELECT DATE('2003-12-31 01:02:03');
La salida será:
2003-12-31
Uso de un índice para una búsqueda de fecha y hora
Muchas tablas de bases de datos del mundo real tienen muchas filas con valores de columna DATETIME
OR TIMESTAMP
que abarcan mucho tiempo, incluso años o incluso décadas. A menudo es necesario usar una cláusula WHERE
para recuperar un subconjunto de ese intervalo de tiempo. Por ejemplo, podríamos querer recuperar filas para la fecha 1 de septiembre de 2016 de una tabla.
Una forma ineficiente de hacerlo es esta:
WHERE DATE(x) = '2016-09-01' /* slow! */
Es ineficiente porque aplica una función, DATE()
, a los valores de una columna. Eso significa que MySQL debe examinar cada valor de x
, y no se puede usar un índice.
Una mejor manera de hacer la operación es esta
WHERE x >= '2016-09-01'
AND x < '2016-09-01' + INTERVAL 1 DAY
Esto selecciona un rango de valores de x
encuentran en cualquier lugar del día en cuestión, hasta pero sin incluir (por lo tanto, <
) la medianoche del día siguiente.
Si la tabla tiene un índice en la columna x
, entonces el servidor de la base de datos puede realizar una exploración de rango en el índice. Eso significa que puede encontrar rápidamente el primer valor relevante de x, y luego escanear el índice de forma secuencial hasta que encuentre el último valor relevante. Una exploración de rango de índice es mucho más eficiente que la exploración de tabla completa requerida por DATE(x) = '2016-09-01
.
No se sienta tentado a usar esto, aunque parezca más eficiente.
WHERE x BETWEEN '2016-09-01' AND '2016-09-01' + INTERVAL 1 DAY /* wrong! */
Tiene la misma eficiencia que el escaneo de rango, pero seleccionará filas con valores de x
caen exactamente a la medianoche del 2 de septiembre de 2016, lo que no es lo que desea.