2009-06-24 4 views
2

Ich schreibe eine Job-Datenbank für ein bisschen Spaß (und T-SQL/SQL Server zu versuchen und zu lernen, und das ist, was ich bisher in meiner Anwendungstabelle habe .Anfänger: Verfügbarkeit in einer Buchungstabelle in SQL überprüfen

application_id name   interviewer  location_id  from     to 
----------------------------------------------------------------------------------------------------------- 
1    Joe Bloggs Sarah Saunders 100    2008-12-25 00:00:00 2008-12-26 00:00:00 
2    Barry White Issac Hayes  100    2008-12-29 00:00:00 2008-12-30 00:00:00 

leicht genug für diesen Zeitraum vorgenommen wurden, um herauszufinden, es ist, was Buchungen, eine einfache select-Anweisung würde diese aus leicht genug finden

Das einzige Problem, das ich jetzt habe, ist wie das, was herauszufinden. Tage enthalten keine Buchungen Ich würde gerne eine Suche in der folgenden Tabelle machen, um zu sehen, welche Daten in dem Raum mit location_id 100 zwischen "2008-12-25 00:00:00" und "2008" verfügbar sind -12-30 00:00:00 "und lassen Sie es zurück, dass kein Interview in dem Raum vom 27. bis 28. gehalten wird.

Ich bin mir sicher, dass dies schmerzhaft einfach ist, aber bitte legen Sie etwas SQL Weisheit auf mich.

ähnlich wie folgt aus:How to implement check availability in hotel reservation system

Antwort

0

Eine Möglichkeit könnte sein, den Datumsbereich in eine Tabellenvariable zu stellen und zu verbinden.

declare @startDate datetime, @endDate datetime 

SET @startDate = '2009-05-01' 
SET @endDate = '2009-05-31' 

declare @dates table (date datetime) 

insert into @dates values (@startDate) 

while @startDate < @endDate 
begin 
    set @startDate = @startDate + 1 

    insert into @dates values (@startDate) 
end 

select d.* from applications a 
left join @dates d on d.date between a.from and a.to 
where a.application_id is null 

Nicht getestet, aber so etwas könnte funktionieren.

1

Sie können eine temporäre Tabelle, um Ihre Tage zu generieren, die (entweder in der oberen Schicht oder mit einer gespeicherten Funktion, die besser wäre, wenn das für SQL-Learning Zweck ist), dann OUTER JOIN es auf der Buchungstabelle und filter auf den Datensatz mit NULL übereinstimmende application_id.

0

Zuerst würde ich beginnen, indem Sie Ihre Abfrage "2008-12-25 00:00:00" bis "2008-12-30 00:00:00" in "Zeiträume" von jeweils einem Tag zerlegen. Dies ist relativ einfach mit einer Tabellenvariablen und einer while-Schleife, daher werde ich hier nicht darauf eingehen.

Dann könnten Sie jeden der Zeiträume von der Tabellenvariable durchlaufen und sehen, ob er mit den vorhandenen Buchungen überlappt (Sie würden nur die Buchungen herausziehen, die den Abfragezeitraum überlappen). Um das zu tun, schlage ich vor, diese Hilfsfunktion zu verwenden:

CREATE FUNCTION [dbo].[fn_TimePeriodsOverlap] 
(
    @pStartTP1 datetime, 
    @pEndTP1 datetime, 
    @pStartTP2 datetime, 
    @pEndTP2 datetime 
) 
RETURNS bit 
AS 
BEGIN 
    DECLARE @Result bit 
    SET @Result = 0 

    IF @pStartTP1 >= @pStartTP2 AND @pStartTP1 < @pEndTP2 
      SET @Result = 1 
    ELSE IF @pEndTP1 >= @pStartTP2 AND @pEndTP1 < @pEndTP2 
      SET @Result = 1 
    ELSE IF @pStartTP2 >= @pStartTP1 AND @pStartTP2 < @pEndTP1 
      SET @Result = 1 
    ELSE IF @pEndTP2 >= @pStartTP1 AND @pEndTP2 < @pEndTP1 
      SET @Result = 1 

    RETURN @Result 

END 

Das wird 1 zurückgeben, wenn zwei Zeitperioden sich überlappen, und andernfalls 0. Dies hat den Vorteil, auch dann zu arbeiten, wenn die Buchungsblöcke nicht immer einen vollen Tag haben.

Verwandte Themen