486 votes

Comment faire une requête pour toutes les dates supérieures à une certaine date dans le serveur SQL ?

J'essaie :

SELECT * 
FROM dbo.March2010 A
WHERE A.Date >= 2010-04-01;

A.Date ressemble : 2010-03-04 00:00:00.000

Cependant, cela ne fonctionne pas.

Quelqu'un peut-il fournir une référence pour expliquer pourquoi ?

31 votes

Mettez des guillemets simples autour d'elle

4 votes

En plus des guillemets, je recommande de toujours utiliser un format sûr et sans ambiguïté pour les chaînes littérales de date uniquement. Le seul format auquel je fais confiance est YYYYMMDD. Voir mon commentaire à la réponse de David pour en connaître la raison...

647voto

David Stratton Points 45298
select *  
from dbo.March2010 A 
where A.Date >= Convert(datetime, '2010-04-01' )

Dans votre requête, 2010-4-01 est traité comme une expression mathématique, donc en substance il se lit

select *  
from dbo.March2010 A 
where A.Date >= 2005; 

( 2010 minus 4 minus 1 is 2005 En le convertissant en un véritable datetime et l'utilisation de guillemets simples permettra de résoudre ce problème).

Techniquement, l'analyseur syntaxique pourrait vous permettre de vous en tirer avec

select *  
from dbo.March2010 A 
where A.Date >= '2010-04-01'

il effectuera la conversion pour vous, mais à mon avis, c'est moins lisible que de convertir explicitement vers un fichier DateTime pour le programmeur de maintenance qui viendra après vous.

44 votes

Le convertisseur explicite n'est pas nécessaire. De plus, je recommande vivement d'utiliser AAAAMMJJ au lieu de AAA-MM-JJ. Pourquoi ? Eh bien, essayez votre code avec SET LANGUAGE FRENCH . :-) Pour cette date, vous obtiendrez le 4 janvier au lieu du 1er avril. Pour d'autres dates, vous obtiendrez peut-être une erreur.

6 votes

@Aaron Bertrant - Dans ma réponse, j'ai indiqué que la conversion n'était pas nécessaire, en commençant par "Techniquement, le pareser pourrait vous permettre de vous en sortir avec <l'échantillon de code final>. Je le trouve simplement plus lisible, car il est évident que c'est une date et une heure. Trop de systèmes de base de données stockent les valeurs de date dans un champ varchar, mais vous avez raison au sujet du format. Normalement, lorsque j'utilise la conversion, j'ajoute également le spécificateur de format, mais j'ai fait mon exemple à l'improviste.

4 votes

@AaronBertrand, j'ai dû utiliser votre suggestion en conjonction avec la réponse ci-dessus : CONVERT(datetime, '20100401 10:01:01') - passing 2010-04-01 fonctionne dans SQL Server Management Studio mais pas lors de l'envoi de la déclaration SQL via PHP/MSSQL.

83voto

SliverNinja Points 15924

Essayez d'enfermer votre date dans une chaîne de caractères.

 select * 
 from dbo.March2010 A
 where A.Date >= '2010-04-01';

5 votes

L'ajout du temps donnera le résultat exact : où A.Date >= 2014-01-12 12:28:00

27voto

dush88c Points 588

Nous pouvons également utiliser la méthode suivante

SELECT * 
FROM dbo.March2010 A
WHERE CAST(A.Date AS Date) >= '2017-03-22';

SELECT * 
    FROM dbo.March2010 A
    WHERE CAST(A.Date AS Datetime) >= '2017-03-22 06:49:53.840';

18voto

Dans votre requête, vous n'avez pas utilisé de guillemets simples autour de la date. C'était le problème. Cependant, vous pouvez utiliser l'une des requêtes suivantes pour comparer la date

SELECT * 
FROM dbo.March2010 A
WHERE A.Date >= '2010-04-01';

SELECT * 
FROM dbo.March2010 A
WHERE A.Date >= CAST('2010-04-01' as Date);

SELECT *  
FROM dbo.March2010 A 
WHERE A.Date >= Convert(datetime, '2010-04-01' )

9voto

Dan Points 61

En résumé, la bonne réponse est :

select * from db where Date >= '20100401'  (Format of date yyyymmdd)

Cela évitera tout problème avec les autres systèmes linguistiques et utilisera l'index.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X