¿Cómo consulto todas las fechas superiores a una fecha determinada en SQL Server?

338

Lo estoy intentando:

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

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

Sin embargo, esto no está funcionando.

¿Alguien puede proporcionar una referencia de por qué?

Eric Francis
fuente
17
poner comillas simples a su alrededor
Kevin DiTraglia
2
Además de las comillas, recomiendo usar siempre un formato seguro y sin ambigüedades para los literales de cadena de solo fecha. El único en el que confío es AAAAMMDD. Vea mi comentario a la respuesta de David por la razón por la que ...
Aaron Bertrand

Respuestas:

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

En su consulta, 2010-4-01se trata como una expresión matemática, por lo que en esencia se lee

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

( 2010 minus 4 minus 1 is 2005 Convirtiéndolo en un apropiado datetimey usando comillas simples se solucionará este problema).

Técnicamente, el analizador podría permitirle salirse con la suya

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

hará la conversión por usted, pero en mi opinión es menos legible que la conversión explícita a un DateTimeprogramador de mantenimiento que vendrá después de usted.

David
fuente
37
La conversión explícita no es necesaria. También recomiendo usar YYYYMMDD en lugar de YYYY-MM-DD. ¿Por qué? Bueno, prueba tu código con SET LANGUAGE FRENCH. :-) Para esa fecha, recibirá el 4 de enero en lugar del 1 de abril. Para otras fechas, es posible que obtenga un error.
Aaron Bertrand
44
@Aaron Bertrant: mi respuesta incluyó que la conversión no es necesaria, comenzando con "Técnicamente, el pareser podría permitirte salirte con la <muestra de código final>. Simplemente me parece más legible, porque es sorprendentemente obvio que esto es un fecha-hora. Demasiados sistemas de bases de datos almacenan valores de fecha en un campo varchar, pero tiene razón sobre el formato. Normalmente, cuando uso la conversión agrego también el especificador de formato, pero estaba haciendo mi muestra en la parte superior de mi la cabeza.
David
1
@AaronBertrand, tuve que usar su sugerencia junto con la respuesta anterior: CONVERT(datetime, '20100401 10:01:01')- pasar 2010-04-01 funciona en SQL Server Management Studio pero no cuando se envía la declaración SQL a través de PHP / MSSQL.
clip el
Creo que está bastante claro que esta es una fecha y, por lo tanto, la conversión no es necesaria.
Jacques Mathieu
56

Intenta incluir tu fecha en una cadena de caracteres.

 select * 
 from dbo.March2010 A
 where A.Date >= '2010-04-01';
SliverNinja - MSFT
fuente
2
Agregar tiempo dará un resultado exacto: donde A.Date> = 2014-01-12 12:28:00
shaijut
16

Podemos usar como abajo también

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
fuente
2
Modificar la columna de predicado de filtro no es una buena idea. Impide el uso del índice casi por completo.
pimbrouwers
3
DateTime start1 = DateTime.Parse(txtDate.Text);

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

Primero convierta TexBox en Datetime y luego ... use esa variable en Query

Suresh Parmar
fuente
3

Para resumirlo todo, la respuesta correcta es:

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

Esto evitará cualquier problema con otros sistemas de idiomas y utilizará el índice.

Dan
fuente