2017-02-17 7 views
-2

Wir stehen vor einem Problem, wenn wir versuchen, Datensätze aus einer Tabelle zwischen zwei Daten auszuwählen.Wählen Sie zwischen zwei Daten in Sql

Tabellenstruktur/Datentypen:

 
    Slno (int, notnull, IsIdentity(yes)) 
    Name (string(50)) 
    StartDate (datetime) 
    EndDate (datetime) 

Beispieldaten:

 
Slno Name  StartDate     EndDate 
1  ABC  2017-02-17 00:00:00.000  2017-02-25 00:00:00.000 
2  ABD  2017-02-15 00:00:00.000  2017-02-25 00:00:00.000 
3  ABD  2017-02-17 00:00:00.000  2017-02-17 00:00:00.000 
4  ABD  2017-02-14 00:00:00.000  2017-02-18 00:00:00.000 
5  ABD  2017-02-17 00:00:00.000  2017-02-20 00:00:00.000 

Wir versuchten, die unterhalb SQL-Abfrage ausgeführt wird:

select * from dbo.XYZ where (getdate() between StartDate and EndDate) 

Die Ausgabe lautet:

 
Slno Name  StartDate     EndDate 
1  ABC  2017-02-17     2017-02-25 
2  ABD  2017-02-17     2017-02-20 

Wir bekommen keine anderen drei Reihen. Was mache ich falsch?

+0

Welche Datentypen sind StartDate und EndDate? –

+0

'Slno' = 2 hat' StartDate' = 2017-02-15 und 'Enddate' = 2017-02-25. Ist das ein Tippfehler in Ihrer Ausgabe? Bitte fügen Sie auch die Ausgabe von 'getdate()' hinzu, damit die Leute diese Frage in Zukunft sehen können. – HoneyBadger

+0

Die Datentypen von startDate und EndDate sind datetime. – user3128590

Antwort

-1

Getdate() bedeutet aktuelles Datum und Uhrzeit. Also die obige Abfrage gibt 2 Zeilen zurück.

können Sie diese Abfrage beziehen:

declare @minDate datetime 
declare @maxDate datetime 

select @minDate = MIN(StartDate) from dbo.XYZ 
select @maxDate = MAX(EndDate) from dbo.XYZ 

    select * from dbo.XYZ where @minDate<= GetDate() OR @maxDate >= GetDate(). 

Es werden alle Zeilen zurück.

+0

Werden nicht alle Zeilen in der Datenbank zurückgegeben, unabhängig davon, um welche Daten es sich handelt? – Tobb

+0

"Ein Aggregat erscheint möglicherweise nicht in der WHERE-Klausel, es sei denn, es befindet sich in einer Unterabfrage in einer HAVING-Klausel oder einer Auswahlliste, und die aggregierte Spalte ist eine äußere Referenz." – Tobb

+0

Wir erhalten Fehler " Ein Aggregat möglicherweise nicht in der WHERE-Klausel angezeigt, es sei denn, es ist in einer Unterabfrage in einer HAVING-Klausel oder einer Auswahlliste enthalten, und die Spalte aggregiert ist eine äußere Referenz. user3128590

0

Versuchen Sie diese, aber wie Todd kommentierte, warum Zeit nicht in der Ausgabe enthalten ist, wenn der Datentyp Datetime ist?

SELECT * 
FROM dbo.XYZ 
WHERE StartDate <= GETDATE() 
    AND EndDate >= GETDATE() 

EDIT: Sieht aus wie Sie Datum speichern, nicht Datetime, so versuchen Sie unter:

SELECT * 
FROM dbo.XYZ 
WHERE StartDate <= CAST(GETDATE() AS DATE) 
    AND EndDate >= CAST(GETDATE() AS DATE) 

EDIT: Nicht wirklich sicher, wie sonst kann ich helfen, sind Sie auf SQL Server, Oracle etc? Das folgende Skript zeigt Ihnen, wie Datums- und Datetime-Datentypen aussehen (SQL Server), und das ist es, was mich am meisten verwirrt, wenn Sie behaupten, dass Ihr Datentyp Datetime ist, aber die Ausgabe wie ein Date aussieht.

SELECT 
cast(GETDATE() as datetime), 
cast(GETDATE() as date) 
+0

Es funktioniert nicht Wir bekommen dasselbe Ergebnis – user3128590

+0

können Sie unten laufen und lassen Sie mich wissen, die Ausgabe, muss ich überprüfen, welche Daten Sie speichern wählen top 1 \t getdate() als Current, \t Startdate, \t EndDate von dbo.XYZ – PawelCz

+0

die Ausgabe, die Sie oben können also zweite Tabelle – user3128590

Verwandte Themen