Comment rechercher toutes les dates supérieures à une certaine date dans SQL Server?

338

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 indiquer pourquoi?

Eric Francis
la source
17
mettre des guillemets simples autour d'elle
Kevin DiTraglia
2
En plus des guillemets, je recommande de toujours utiliser un format sûr et sans ambiguïté pour les littéraux de chaîne de date uniquement. Le seul en qui j'ai confiance est YYYYMMDD. Voir mon commentaire à la réponse de David pour la raison pour laquelle ...
Aaron Bertrand

Réponses:

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

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

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

(Le 2010 minus 4 minus 1 is 2005 convertir en un fichier approprié datetimeet utiliser des guillemets simples résoudra ce problème.)

Techniquement, l'analyseur peut vous permettre de vous en sortir avec

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

il fera la conversion pour vous, mais à mon avis, il est moins lisible que la conversion explicite en un DateTimepour le programmeur de maintenance qui viendra après vous.

David
la source
37
La conversion explicite n'est pas nécessaire. Je recommande également fortement d'utiliser YYYYMMDD au lieu de YYYY-MM-DD. Pourquoi? Eh bien, essayez votre code avec SET LANGUAGE FRENCH. :-) Pour cette date, vous obtiendrez le 4 janvier au lieu du 1er avril. Pour les autres dates, vous pourriez obtenir une erreur à la place.
Aaron Bertrand
4
@Aaron Bertrant - Ma réponse incluait que la conversion n'est pas nécessaire, en commençant par "Techniquement, l'analyseur pourrait vous permettre de vous en tirer avec <l'échantillon de code final>. Je le trouve juste plus lisible, car il est d'une évidence frappante qu'il s'agit d'un date-heure. Trop de systèmes de bases de données stockent des valeurs de date dans un champ varchar, mais vous avez raison sur le format. Normalement, lorsque j'utilise la conversion, j'ajoute également le spécificateur de format, mais je faisais mon échantillon du haut de mon tête
David
1
@AaronBertrand, j'ai dû utiliser votre suggestion en conjonction avec la réponse ci-dessus: CONVERT(datetime, '20100401 10:01:01')- le passage du 01/04/2010 fonctionne dans SQL Server Management Studio mais pas lors de l'envoi de l'instruction SQL via PHP / MSSQL.
trombone
Je pense qu'il est assez clair que c'est une date, et donc la conversion n'est pas nécessaire.
Jacques Mathieu
56

Essayez de placer votre date dans une chaîne de caractères.

 select * 
 from dbo.March2010 A
 where A.Date >= '2010-04-01';
SliverNinja - MSFT
la source
2
L'ajout de temps donnera le résultat exact: où A.Date> = 2014-01-12 12:28:00
shaijut
16

Nous pouvons également utiliser comme ci-dessous

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';
dush88c
la source
2
La modification de la colonne de prédicat du filtre n'est pas du tout une bonne idée. Il empêche l'utilisation d'index presque entièrement.
pimbrouwers
3
DateTime start1 = DateTime.Parse(txtDate.Text);

SELECT * 
FROM dbo.March2010 A
WHERE A.Date >= start1;

Convertissez d'abord TexBox en Datetime puis .... utilisez cette variable dans la requête

Suresh Parmar
la source
3

Pour résumer le tout, la bonne réponse est:

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

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

Dan
la source