2008-11-25 10 views
10

Utilizando la sintaxis de MySQL y tener una tabla con una fila como:En SQL, ¿cómo comparar valores de fecha?

mydate DATETIME NULL, 

¿Hay una manera de hacer algo como:

... WHERE mydate<='2008-11-25'; 

Estoy intentando pero no realmente conseguir que funcione.

Respuesta

8

Nevermind encontró una respuesta. Ty lo mismo para cualquiera que estuviera dispuesto a responder.

WHERE DATEDIFF(mydata,'2008-11-20') >=0; 
+0

De nada;) – Arvo

+3

Esto parece lento: llamada de función y conversión implícita para cada fila de la tabla. Debe haber una forma de comparar fechas más directamente. –

+0

Los índices no se utilizan de esta manera ... – FerranB

18

Uh, WHERE mydate<='2008-11-25' es la manera de hacerlo. Eso debería funcionar.

¿Aparece un mensaje de error? ¿Estás usando una versión antigua de MySQL?

Editar: El siguiente funciona muy bien para mí en MySQL 5.x

create temporary table foo(d datetime); 
insert into foo(d) VALUES ('2000-01-01'); 
insert into foo(d) VALUES ('2001-01-01'); 
select * from foo where d <= '2000-06-01'; 
+0

En mi DBMS de PostgreSQL, de hecho, funciona bien. Puede ser una debilidad de MySQL? – bortzmeyer

+0

Sí, pero no funciona en mysql – fmsf

+1

Err, también funciona en MySQL. :) Solo lo intenté para asegurarme de no estar loco. ¿Qué versión de MySQL está usando fmfs? ¿Le da un error? – Eli

6

En la sintaxis SQL estándar, se debería utilizar:

WHERE mydate <= DATE '2008-11-20' 

Es decir, la palabra clave FECHA debe preceder a la cadena . En algunos DBMS, sin embargo, no necesita ser tan explícito; el sistema convertirá automáticamente la columna DATE en una cadena, o la cadena en un valor DATE. Existen, nominalmente, algunas implicaciones interesantes si el DATE se convierte en una cadena; si tiene fechas en el primer milenio (0001-01-01 .. 0999-12-31) y el/los cero (s) inicial (es) son omitidos por el sistema de formateo.

+0

Tenga en cuenta que, si todas las fechas están en el formato ISO 8601 como se muestra, las comparaciones de cadenas funcionarán (es una característica de ISO 8601). – bortzmeyer

+0

Si se incluyen los ceros a la izquierda, sí.En teoría, si tiene fechas anteriores al 1000-01-01, el DBMS podría omitir ceros a la izquierda. No estoy seguro de que sea muy probable, pero se han sabido cosas más divertidas. Oracle admite las fechas BCE (BC); aquellos no se pueden comparar confiablemente como cadenas. –

0

Se podría añadir el componente de tiempo

WHERE mydate<='2008-11-25 23:59:59' 

pero que puede fallar en las fechas de conmutación DST si es mydate '2008-11-25 24:59:59', por lo que es probable que sea más seguro para agarrar todo antes de la próxima fecha:

WHERE mydate < '2008-11-26 00:00:00' 
0

Su problema puede ser que se trata de datos de fecha y hora, no sólo fechas. Si una fila tiene un fechado que es '2008-11-25 09:30 AM', entonces su DONDE mydate < = '2008-11-25'; no va a devolver esa fila. '2008-11-25' tiene una hora implícita de 00:00 (medianoche), así que aunque la parte de la fecha sea la misma, no son iguales, y mydate es más grande.

Si usa < '2008-11-26' en lugar de < = '2008-11-25', eso funcionaría. El método Datediff funciona porque compara solo la parte de la fecha e ignora los tiempos.

Cuestiones relacionadas