2008-11-25 8 views
10

Utilisation de la syntaxe MySQL et ayant une table avec une ligne comme:En SQL comment comparer les valeurs de date?

mydate DATETIME NULL, 

est-il un moyen de faire quelque chose comme:

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

Je suis en train, mais pas vraiment la faire fonctionner.

Répondre

8

Nevermind a trouvé une réponse. Ty la même chose pour tous ceux qui étaient prêts à répondre.

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

De rien;) – Arvo

+3

Cela semble lent: appel de fonction et conversion implicite pour chaque ligne de la table. Il doit y avoir un moyen de comparer les dates plus directement. –

+0

Les index ne sont pas utilisés de cette façon ... – FerranB

18

Euh, WHERE mydate<='2008-11-25'est la façon de le faire. Cela devrait fonctionner.

Un message d'erreur s'affiche-t-il? Utilisez-vous une ancienne version de MySQL?

Edit: Ce qui suit fonctionne très bien pour moi sur 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

Sur mon SGBD PostgreSQL, en effet, cela fonctionne très bien. Peut être une faiblesse de MySQL? – bortzmeyer

+0

Yup ça ne marche pas dans mysql – fmsf

+1

Err, ça marche aussi sur MySQL. :) Je l'ai juste essayé pour m'assurer que je ne suis pas folle. Quelle version de MySQL vous utilisez fmfs? Avez-vous une erreur? – Eli

6

Dans la syntaxe standard SQL, vous utilisez:

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

C'est, le mot-clé DATE doit précéder la chaîne . Cependant, dans certains SGBD, vous n'avez pas besoin d'être aussi explicite. le système convertira automatiquement la colonne DATE en chaîne ou la chaîne en valeur DATE. Il y a nominalement quelques implications intéressantes si la DATE est convertie en une chaîne - si vous avez des dates dans le premier millénaire (0001-01-01 .. 0999-12-31) et le ou les zéro (s) de tête sont omis par le système de formatage.

+0

Notez que si toutes les dates sont au format ISO 8601 comme indiqué, les comparaisons de chaînes fonctionneront (c'est une caractéristique de l'ISO 8601). – bortzmeyer

+0

Si les zéros en tête sont inclus, oui.En théorie, si vous avez des dates antérieures au 01-01-01, le SGBD peut omettre les zéros en tête. Je ne suis pas sûr que ce soit très probable, mais les choses les plus drôles ont été connues. Oracle prend en charge les dates BCE (BC); ceux-ci ne se comparent pas de manière fiable en tant que chaînes. –

0

Vous pouvez ajouter le composant de temps

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

mais qui risque d'échouer sur les dates de basculement DST si mydate est « 2008-11-25 24:59:59 », il est donc probablement plus sûr de saisir tout avant la date suivante:

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

Votre problème est peut-être que vous traitez des données DATETIME, pas seulement des dates. Si une ligne a un mydate qui est '2008-11-25 09:30 AM', alors votre O my mydate < = '2008-11-25'; ne va pas retourner cette ligne. '2008-11-25' a un temps implicite de 00:00 (minuit), donc même si la partie date est la même, ils ne sont pas égaux, et mydate est plus grand.

Si vous utilisez < '2008-11-26' au lieu de < = '2008-11-25', cela fonctionnerait. La méthode Datediff fonctionne car elle compare uniquement la partie date et ignore les heures.

Questions connexes