Jak zapytać o wszystkie daty większe niż określona data w SQL Server?

338

Próbuję:

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

A.Date wygląda jak: 2010-03-04 00:00:00.000

To jednak nie działa.

Czy ktoś może podać odniesienie do dlaczego?

Eric Francis
źródło
17
umieść wokół niego pojedyncze cytaty
Kevin DiTraglia
2
Oprócz cytatów zalecam zawsze stosowanie bezpiecznego i jednoznacznego formatu literałów ciągów zawierających tylko datę. Jedynym, któremu ufam, jest RRRRMMDD. Zobacz mój komentarz do odpowiedzi Davida z powodu, dla którego ...
Aaron Bertrand

Odpowiedzi:

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

W zapytaniu 2010-4-01jest traktowane jako wyrażenie matematyczne, więc w istocie jest czytane

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

( 2010 minus 4 minus 1 is 2005 Przekształcenie go na właściwy datetimei użycie pojedynczych cudzysłowów rozwiąże ten problem).

Technicznie parser może pozwolić ci na ucieczkę

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

zrobi dla ciebie konwersję, ale moim zdaniem jest mniej czytelny niż jawna konwersja na DateTimeprogramistę konserwacji, który pojawi się po tobie.

David
źródło
37
Wyraźna konwersja nie jest konieczna. Również bardzo polecam użycie RRRRMMDD zamiast RRRR-MM-DD. Dlaczego? Wypróbuj swój kod SET LANGUAGE FRENCH. :-) Za tę datę otrzymasz 1 stycznia zamiast 1 kwietnia. W przypadku innych dat możesz zamiast tego otrzymać błąd.
Aaron Bertrand
4
@Aaron Bertrant - Moja odpowiedź zawierała informację, że konwersja nie jest konieczna, zaczynając od „Technicznie, pareser może pozwolić ci na <końcową próbkę kodu>. Po prostu uważam, że jest bardziej czytelna, ponieważ jest uderzająco oczywiste, że jest to data-godzina. Zbyt wiele systemów baz danych przechowuje wartości dat w polu varchar, ale masz rację co do formatu. Zwykle, gdy używam konwersji, dodaję także specyfikator formatu, ale robiłem próbkę poza moim głowa
David
1
@AaronBertrand, musiałem skorzystać z Twojej sugestii w połączeniu z powyższą odpowiedzią: CONVERT(datetime, '20100401 10:01:01')- przekazanie 2010-04-01 działa w SQL Server Management Studio, ale nie przy wysyłaniu instrukcji SQL przez PHP / MSSQL.
spinacz
Myślę, że jest wystarczająco jasne, że jest to data, dlatego konwersja nie jest konieczna.
Jacques Mathieu
56

Spróbuj zawrzeć datę w ciągu znaków.

 select * 
 from dbo.March2010 A
 where A.Date >= '2010-04-01';
SliverNinja - MSFT
źródło
2
Dodanie czasu da dokładny wynik: gdzie A.Data> = 2014-01-12 12:28:00
shaijut
16

Możemy również użyć jak poniżej

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
źródło
2
Modyfikowanie kolumny predykatów filtrów nie jest dobrym pomysłem. Niemal całkowicie zapobiega to wykorzystaniu indeksu.
pimbrouwers
3
DateTime start1 = DateTime.Parse(txtDate.Text);

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

Najpierw przekonwertuj TexBox na Datetime, a następnie ... użyj tej zmiennej do zapytania

Suresh Parmar
źródło
3

Podsumowując, prawidłowa odpowiedź to:

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

Pozwoli to uniknąć problemów z innymi systemami językowymi i użyje indeksu.

Dan
źródło