2009-07-14 9 views
0

Ich habe eine Tabelle wie folgtWie zwei Datumsfelder mit den beiden Datumsvariablen Vergleichen

ID  bigint 
TaskName nvarchar(50) 
StartDate datetime  -- Start date of task 
EndDate datetime  -- End Date Of Task 

Ich versuche, eine Prozedur zu schreiben, die zwei Eingänge nimmt @FromDate und @EndDate als Datum- Liste zu erhalten von TaskNames, die sich zwischen Eingabeparametern befinden.

Kann jede Stelle mir helfen, das Wo Zustand zu schreiben für sie

Danke und Gruß, Rohan

+0

Möchten Sie Aufgaben, die sich überschneiden oder vollständig innerhalb des angegebenen Zeitrahmens ausgeführt werden? (dh wenn eine Aufgabe vor Ihrem @FromDate beginnt, aber zwischen @FromDate und @EndDate endet, möchten Sie sie in das Ergebnis einbeziehen?) –

+0

Haben Sie meine Antwort versucht? – Eric

Antwort

0

So etwas wie das folgende sollte für Sie arbeiten:

select * from myTable 
where StartDate > @FromDate 
and EndDate < @EndDate 

Oder so etwas wie

select * from myTable 
where StartDate between @FromDate and @EndDate 

Der erste bekommt alle ta Sks, die zwischen deinem Start- und Enddatum liegen. Die zweite erhält alle Aufgaben, die (unabhängig von der Endzeit) zwischen Ihrem Start- und Enddatum gestartet wurden.

0

Sie nicht angeben, wenn Sie Zeit oder sind Endpunkte betrachten will, aber ich werde nicht jede mögliche Kombination schreiben ... das hält Zeit und ermöglicht die Aufnahme von Endpunkten:

SELECT 
    * 
    FROM YourTable 
    WHERE StartDate>[email protected] AND EndDate<[email protected] 
0
WHERE (StartDate < @Fromdate) AND (EndDate > @EndDate) 

gibt die Aufgaben, die früher als @FromDate gestartet wurden, aber nicht vor @EndDate beendet wurden.

4
WHERE StartDate <= @EndDate AND EndDate >= @FromDate 

Sollte der Trick

Edit: Beispielcode verwendete ich verschiedene Szenarien testen:

DECLARE @Data TABLE (StartDate DATETIME, EndDate DATETIME, ID INTEGER) 
INSERT @Data 
SELECT '2009-05-10','2009-05-20', 1 
UNION 
SELECT '2009-05-15','2009-05-20', 2 
UNION 
SELECT '2009-05-01','2009-06-01', 3 

DECLARE @FromDate DATETIME 
DECLARE @EndDate DATETIME 
SET @FromDate = '2009-05-11' 
SET @EndDate = '2009-05-18' 

SELECT * FROM @Data 
WHERE StartDate <= @EndDate AND EndDate >= @FromDate 
+0

Dies wird Aufgaben zurückgeben, die vor dem Bereich beginnen und nach dem Bereich enden, nicht solche innerhalb des Bereichs –

+0

@KM - nein, das stimmt nicht. Hast Du es versucht? Ich werde meinen Beitrag mit Beispielcode bearbeiten, den ich verwendet habe, um verschiedene Szenarien – AdaTheDev

+0

zu testen, wenn ich Ihren Code ausführen, bekomme ich die Zeile für "2009-05-01" - "2009-06-01" und für mich ist das nicht innerhalb Ihrer gegeben Datumsbereich von "2009-05-11" - "2009-05-18" –

0

Sie dies tun könnte.

0

UPDATE: Nach einer guten Diskussion mit Ada sehe ich, wie seine Abfrage die optimale Lösung ist. Während meine Antwort unten funktioniert, ist es überflüssig. Ich werde diese Antwort hier der Geschichte wegen hinterlassen. +1 zu Adas Antwort.

Wie ich die Frage verstehe, will er alle Aufgaben abrufen, an denen zu irgendeinem Zeitpunkt zwischen den angegebenen Daten gearbeitet wurde. Dies beinhaltet teilweise überlappende Aufgaben sowie Aufgaben, die während des Zeitintervalls begonnen und beendet wurden.

zwei Zeitschlitze überlappen, wenn:

  • Die Startzeit für Aufgabe 1 an beliebiger Stelle zwischen dem Start- und Endzeiten Aufgabe fällt 2 OR
  • Die Endzeit für Aufgabe 1 fällt irgendwo zwischen Anfang und Ende Zeiten der Aufgabe 2 OR
  • Start- und Endzeiten

ich habe diese Methode erfolgreich in einem Reservierungssystem verwendet, um eine Überlappung bei den Buchungen zu verhindern.

Bis jetzt in den Antworten habe ich keine Abfrage gesehen, die diese beiden Bedingungen überprüft. Hier ist mein Versuch:

WHERE ((StartDate >= @FromDate) AND (StartDate <= @EndDate)) 
OR ((EndDate >= @FromDate) AND (EndDate <= @EndDate)) 
OR ((StartDate <= @EndDate) AND (EndDate >= @StartDate)) 
+0

Dies funktioniert nicht. Wenn Sie dieses WHERE in den Beispielcode in meiner Bearbeitung mit @ FromDate = 2009-05-16 und @ EndDate = 2009-05-19 einbetten, werden keine Ergebnisse zurückgegeben. – AdaTheDev

+0

OK - mit der Korrektur sollte es jetzt funktionieren, wenn die gesamte Aufgabe in das Intervall passt, sowie wenn Überschneidungen auftreten. –

+0

Jetzt sind Sie an dem Punkt, wo die ersten 2 WHERE-Bedingungen redundant sind, daher brauchen Sie nur die letzte Bedingung, um alle Szenarien zu erfüllen ... gemäß meiner ursprünglichen Antwort – AdaTheDev

Verwandte Themen