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 un DATETIME .
  • Este patrón evita tratar con años bisiestos y otros cálculos de datos.
  • Funciona si x es DATE , DATETIME o TIMESTAMP .

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.



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow