2010-08-12 22 views
7

me gustaría select * from table where dates between (some_date and another_date)mysql: buscar entre las fechas almacenadas como varchar

el problema es que las fechas se almacenan como varchar!

Estos son ejemplos de las fechas que tengo:

7/29/2010 9:53 AM 
7/16/2010 7:57:39 AM 

favor notar que algunos registros tienen segundos y algunos no lo hacen

i no se preocupan por el momento a todos Sólo necesito la fecha

reporttime es el campo date

esto no está funcionando:

SELECT * FROM batchinfo 
where cast(reporttime as date) between ('7/28/10' and '7/29/10') 

esto:

SELECT * from batchinfo WHERE reporttime BETWEEN STR_TO_DATE(7/28/2010, '%m/%/d/%Y %h:%i:%s %p') 
       AND STR_TO_DATE(7/29/2010, '%m/%/d/%Y %h:%i:%s %p') 

está regresando:

Truncated incorrect datetime value: '7/8/2010 11:47 AM' 
Incorrect datetime value: '0.00012009' for function str_to_date 

esto:

SELECT * from batchinfo WHERE STR_TO_DATE(reporttime, '%m/%/d/%Y %h:%i:%s %p') BETWEEN STR_TO_DATE(7/28/2010, '%m/%/d/%Y') 
                  AND STR_TO_DATE(7/29/2010, '%m/%/d/%Y') 

está regresando:

Incorrect datetime value: '7/8/2010 11:47 AM' for function str_to_date 

POTROS OMG:

estoy tomando todo antes del primer espacio en blanco:

SELECT * from batchinfo WHERE STR_TO_DATE(LEFT(reporttime,LOCATE(' ',reporttime)), '%m/%/d/%Y') BETWEEN STR_TO_DATE(7/28/2010, '%m/%/d/%Y') 
                  AND STR_TO_DATE(7/29/2010, '%m/%/d/%Y') 

y ahora me sale este regresó:

Incorrect datetime value: '7/8/2010' for function str_to_date 
+1

Ver mi actualización - en el futuro, que sería de ayuda si usted fuera más claro acerca de lo que el el problema estaba en el comienzo. Proporcione datos de ejemplo, estructura de tabla y salida esperada. –

+1

Ver mi respuesta actualizada – Mchl

+1

El formato de fecha que proporcioné estaba equivocado. Debería ser '% m /% d /% Y'. También cuando pones fechas en tus consultas, ponlas entre comillas '' (porque de hecho son cadenas) – Mchl

Respuesta

7

Quiere buscar entre fechas, almacenarlas como fechas. Al almacenarlos como cadenas, te disparas en el pie. Básicamente necesitarás extraer la parte de la fecha de la cadena (usando SUBSTR() o LEFT()) y analizar el formato de la fecha (usando STR_TO_DATE()).

El rendimiento de tal solución será espantoso.

STR_TO_DATE(LEFT(reporttime,LOCATE(' ',reporttime)),'%m/%d/%Y') BETWEEN '2010-07-28' AND '2010-07-29'

+0

actualizado ¿puedes por favor mostrarme cómo se vería la declaración seleccionada –

+1

ver respuesta actualizada – Mchl

+0

Valor de fecha y hora incorrecto: '7/8/2010' para la función str_to_date –

0

Puede CAST sus valores varchar a DATETIME o DATE Tipo .

WHERE CAST(dates AS DATE) BETWEEN (7/28/10 and 7/29/10) 

Puede que esta no sea una solución óptima, ya que puede perder el beneficio que proporcionan los índices.

+0

SELECCIONAR * FROM batchinfo donde se emitió (tiempo de informe como fecha) entre (29/07/10 y 28/07/10) - esto no funciona –

+1

Consulta: SELECT CAST ('7/29/2010 9:53 AM' COMO FECHA); Resultado: nulo – Mchl

+0

No estoy seguro, pero ¿no deberían revertirse el 7/29/10 y el 7/28/10? – bobs

5

Use STR_TO_DATE to convert the strings to the DateTime data type. La taquigrafía formato se encuentra bajo DATE_FORMAT:

STR_TO_DATE(column, '%m/%/d/%Y %h:%i:%s %p') 

El problema es, Vas a tener que actualizar las fechas de VARCHAR a ser todos el mismo formatoprimero, antes de poder utilizar:

WHERE STR_TO_DATE(reporttime, '%m/%/d/%Y %h:%i:%s %p') BETWEEN STR_TO_DATE(some_date, '%m/%/d/%Y') 
                  AND STR_TO_DATE(another_date, '%m/%/d/%Y') 

Los formatos de fecha no son consistentes (algunos usan guiones, otros recortes y el orden Año/Mes/día pueden ser totalmente diferentes ...), por lo que STR_TO_DATE es el medio & más congruente convirtiendo una cadena en DateTime. Solo después de que el valor sea DateTime, ¿la funcionalidad de Fecha/Hora estará disponible como DATE() para obtener solo la porción de fecha ...

Debido al cambio en el tipo de datos, no se puede usar un índice en alguna fecha & columnas otra fecha.

+0

reporttime es varchar, no date –

+0

@OMG Ponies: por favor vea la pregunta actualizada, muchas gracias por su ayuda –

+0

@ | __: Actualicé la cláusula WHERE en mi respuesta - no estaba claro para mí lo que está convirtiendo . Pero tenga en cuenta que los datos que enumera no están formateados de manera consistente. –

1

SI está utilizando SQL utilizan esta consulta

datos

DECLARE @Dates TABLE (StartDate varchar(100)); 

INSERT INTO @Dates VALUES ('7/1/2010 9:10 AM'); 
INSERT INTO @Dates VALUES ('7/5/2010 10:33 AM'); 
INSERT INTO @Dates VALUES ('7/13/2010 04:53 AM'); 
INSERT INTO @Dates VALUES ('7/22/2010 8:45 AM'); 
INSERT INTO @Dates VALUES ('7/10/2010 11:20 AM'); 
INSERT INTO @Dates VALUES ('7/11/2010 12:40 AM'); 

Consulta:

SELECT * FROM @Dates 
WHERE (CONVERT(datetime,StartDate,101) >= CONVERT(datetime,'7/1/2010 9:10 AM',101)) 
             AND (CONVERT(datetime,StartDate,101) <= CONVERT(datetime,'7/15/2010 9:10 AM',101)) 
ORDER BY CONVERT(datetime,StartDate,101) 
0

Esta consulta Fecha funcione a la perfección ...

Database 'Date' Will be like '01/01/2016' and datatype is 'varchar' 

SELECT * FROM `test` WHERE STR_TO_DATE(`test`.`date`, '%d/%m/%Y') BETWEEN '2016-01-01' AND '2016-01-31' ORDER BY `test`.`date` ASC 
0

Si la fecha está en Varchar

de consulta Y c.sentdate> '2016-jun-15'

Cuestiones relacionadas