Come eseguire una query per tutte le date superiori a una determinata data in SQL Server?


338

Sto provando:

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

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

Tuttavia, questo non funziona.

Qualcuno può fornire un riferimento per il perché?


17
metti delle virgolette intorno
Kevin DiTraglia,

2
Oltre alle virgolette, consiglio sempre di usare un formato sicuro e inequivocabile per i letterali di stringhe solo per data. L'unico di cui mi fido è AAAAMMGG. Vedi il mio commento alla risposta di David per il motivo per cui ...
Aaron Bertrand,

Risposte:


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

Nella tua query, 2010-4-01viene trattato come un'espressione matematica, quindi in sostanza viene letto

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

(La 2010 minus 4 minus 1 is 2005 conversione in una corretta datetimee l'utilizzo di virgolette singole risolverà questo problema.)

Tecnicamente, il parser potrebbe permetterti di cavartela

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

farà la conversione per te, ma secondo me è meno leggibile della conversione esplicita in a DateTimeper il programmatore di manutenzione che verrà dopo di te.


37
La conversione esplicita non è necessaria. Inoltre consiglio vivamente di utilizzare AAAAMMGG anziché AAAA-MM-GG. Perché? Bene, prova il tuo codice con SET LANGUAGE FRENCH. :-) Per quella data riceverai il 4 gennaio anziché l'1 aprile. Per altre date potresti invece ricevere un errore.
Aaron Bertrand,

4
@Aaron Bertrant - La mia risposta ha incluso che la conversione non è necessaria, a partire da "Tecnicamente, il pareser potrebbe lasciarti andare con <esempio di codice finale>. Lo trovo più leggibile, perché è sorprendentemente ovvio che questo è un data-ora. Troppi sistemi di database memorizzano i valori della data in un campo varchar, ma hai ragione sul formato. Normalmente, quando utilizzo la conversione, aggiungo anche l'identificatore di formato, ma stavo facendo il mio campione dalla parte superiore del mio capo
David,

1
@AaronBertrand, ho dovuto usare il tuo suggerimento in combinazione con la risposta sopra: CONVERT(datetime, '20100401 10:01:01')- il passaggio del 01-04-2010 funziona in SQL Server Management Studio ma non quando si invia l'istruzione SQL tramite PHP / MSSQL.
graffetta

Penso che sia abbastanza chiaro che questa è una data, e quindi la conversione non è necessaria.
Jacques Mathieu,

56

Prova a racchiudere la tua data in una stringa di caratteri.

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

2
L'aggiunta di tempo darà il risultato esatto: dove A.Date> = 2014-01-12 12:28:00
shaijut

16

Possiamo usare anche come di seguito

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';

2
La modifica della colonna del predicato del filtro non è una buona idea. Impedisce l'utilizzo dell'indice quasi interamente.
pimbrouwers,

3
DateTime start1 = DateTime.Parse(txtDate.Text);

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

Prima converti TexBox in Datetime, poi .... usa quella variabile in Query


3

Per riassumere, la risposta corretta è:

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

Ciò eviterà qualsiasi problema con altri sistemi linguistici e utilizzerà l'indice.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.