Como faço para consultar todas as datas maiores que uma determinada data no SQL Server?

338

Estou tentando:

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

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

No entanto, isso não está funcionando.

Alguém pode fornecer uma referência para o porquê?

Eric Francis
fonte
17
coloque aspas simples ao redor dele
Kevin DiTraglia 17/05
2
Além das aspas, recomendo sempre o uso de um formato seguro e inequívoco para literais de string somente de data. O único em quem confio é AAAAMMDD. Ver o meu comentário para a resposta de David para a razão pela qual ...
Aaron Bertrand

Respostas:

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

Na sua consulta, 2010-4-01é tratada como uma expressão matemática, portanto, em essência, é lida

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

A 2010 minus 4 minus 1 is 2005 conversão para uma adequada datetimee o uso de aspas simples corrigirá esse problema.

Tecnicamente, o analisador pode permitir que você se safe

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

ele fará a conversão para você, mas, na minha opinião, é menos legível do que converter explicitamente em um DateTimeprogramador de manutenção que virá depois de você.

David
fonte
37
A conversão explícita não é necessária. Também recomendo usar o AAAAMMDD em vez do AAAA-MM-DD. Por quê? Bem, tente seu código com SET LANGUAGE FRENCH. :-) Nessa data, você receberá 4 de janeiro em vez de 1º de abril. Para outras datas, você poderá receber um erro.
Aaron Bertrand
4
@ Aaron Bertrant - Minha resposta incluiu que a conversão não é necessária, começando com "Tecnicamente, o pareador pode permitir que você se dê bem com <amostra de código final>. Eu acho isso mais legível, porque é surpreendentemente óbvio que essa é uma Muitos sistemas de banco de dados armazenam valores de data em um campo varchar, mas você está certo sobre o formato.Normalmente, ao usar a conversão, adiciono também o especificador de formato, mas estava fazendo minha amostra em cima do meu cabeça.
David
11
@AaronBertrand, eu tive que usar sua sugestão em conjunto com a resposta acima: CONVERT(datetime, '20100401 10:01:01')- a passagem 2010-04-01 funciona no SQL Server Management Studio, mas não ao enviar a instrução SQL via PHP / MSSQL.
paperclip
Eu acho que é claro o suficiente que esta é uma data e, portanto, a conversão não é necessária.
Jacques Mathieu
56

Tente incluir sua data em uma sequência de caracteres.

 select * 
 from dbo.March2010 A
 where A.Date >= '2010-04-01';
SliverNinja - MSFT
fonte
2
Adicionar tempo dará o resultado exato: onde A.Date> = 2014-01-12 12:28:00
shaijut 4/15/15
16

Podemos usar como abaixo também

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
fonte
2
Modificar a coluna de predicado do filtro não é uma boa ideia. Impede quase totalmente o uso do índice.
pimbrouwers
3
DateTime start1 = DateTime.Parse(txtDate.Text);

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

Primeiro converta o TexBox no Datetime e, em seguida, use essa variável na Consulta

Suresh Parmar
fonte
3

Para resumir tudo, a resposta correta é:

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

Isso evitará qualquer problema com outros sistemas de idiomas e usará o índice.

Dan
fonte