length - mysql convertir string a numero
MySQL compara cadena de FECHA con cadena del campo DATETIME (6)
Tengo una pregunta: ¿es posible seleccionar de una base de datos MySQL comparando una cadena DATE "2010-04-29" con cadenas almacenadas como DATETIME (2010-04-29 10:00)?
Tengo un selector de fecha que filtra los datos y me gustaría consultar la tabla por el campo DATETIME de esta manera:
SELECT * FROM `calendar` WHERE startTime = ''2010-04-29''"
... y me gustaría obtener la fila que tiene el valor DATETIME de "2010-04-29 10:00".
¿Alguna sugerencia? Gracias.
Si desea seleccionar todas las filas donde la parte DATE de una columna DATETIME coincide con un cierto literal, no puede hacerlo así:
WHERE startTime = ''2010-04-29''
porque MySQL no puede comparar un DATE y un DATETIME directamente. Lo que MySQL hace, extiende el literal FECHA dado con el tiempo ''00: 00: 00 ''. Entonces tu condición se vuelve
WHERE startTime = ''2010-04-29 00:00:00''
¡Ciertamente no es lo que quieres!
La condición es un rango y, por lo tanto, se debe dar como rango. Hay varias posibilidades:
WHERE startTime BETWEEN ''2010-04-29 00:00:00'' AND ''2010-04-29 23:59:59''
WHERE startTime >= ''2010-04-29'' AND startTime < (''2010-04-29'' + INTERVAL 1 DAY)
Existe una pequeña posibilidad de que la primera sea incorrecta: cuando su columna DATETIME usa una resolución de segundo y hay una cita a las 23:59:59 + epsilon. En general, sugiero usar la segunda variante.
Ambas variantes pueden usar un índice en startTime que será importante cuando la tabla crezca.
Use lo siguiente:
SELECT * FROM `calendar` WHERE DATE(startTime) = ''2010-04-29''
Solo como referencia tengo una tabla de registro de 2 millones, ejecuté una consulta similar. La respuesta de Salils tomó 4.48 segundos, lo anterior tomó 2.25 segundos.
Entonces, si la mesa es GRANDE, sugeriría esto más bien.
SELECT * FROM `calendar` WHERE DATE(startTime) = ''2010-04-29'';
ayuda, puede convertir los valores como DATE
antes de comparar.
SELECT * FROM `calendar` WHERE DATE_FORMAT(startTime, "%Y-%m-%d") = ''2010-04-29''"
O
SELECT * FROM `calendar` WHERE DATE(startTime) = ''2010-04-29''
SELECT * FROM `calendar` WHERE startTime like ''2010-04-29%''
También puede usar operadores de comparación en las fechas de MySQL si quiere encontrar algo después o antes. Esto se debe a que están escritos de tal manera (de mayor a menor con ceros a la izquierda) que una ordenación de cadena simple los clasificará correctamente.
SELECT * FROM sample_table WHERE last_visit = DATE_FORMAT(''2014-11-24 10:48:09'',''%Y-%m-%d %H:%i:%s'')
esto para formato de fecha y hora en mysql usando DATE_FORMAT(date,format)
.