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?


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.


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

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

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


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.