| 

.NET C# Java Javascript Exception

1
Hallo,

also Problem ist folgendes:
Wir haben eine SQL-Datenbank "Hotel" mit folgenden Tabellen und Feldern:
1. Buchung:
- Buchungsnr (Primärschlüssel, auto-inc)
- Zimmernummer
- belegtVon
- belegtBis

2. Zimmer:
- Zimmernummer (Primärschlüssel)
- Kategorie


So, nun zum eigentlichen Problem:
Ich brauche eine SELECT-Abfrage, die mir die freien Zimmer ab heute bis zum 31.12.2011 zurück gibt und mir dabei auch den Zeitraum nennt an dem das Zimmer frei sein wird. Arbeiten tue ich mit dem "Microsoft SQL Server Management Studio".

Kann mir dabei jemand aus der Community vielleicht helfen? Komme da leider nicht weiter.

Danke schonmal im Voraus!
05.07.2011
mazaka 51 1 2
Im allgemeinen wird es mehrere Zeiträume geben, an dem ein Zimmer frei sein wird. Wie soll das Ergebnis dann aussehen? Eine Zeile pro Zimmer und Zeitraum? Oder nur der erste Zeitraum? Oder ...?
Matthias Hlawatsch 05.07.2011
Sehe ich genauso wie Matthias. Ohne eine Vorstellung über das Ergebnis führt das zu Raterei. Bitte gib uns ein Beispiel für die Daten in den Tabellen und wie das Abfrageergebnis aussehen soll.
oopexpert 05.07.2011
Ein paar Zeilen DDL-Code für die Tabellen-Definitionen und die Fremdschlüssel-Beziehungen wären ebenfalls hilfreich...
FrankHell 05.07.2011
4 Antworten
1
Hallo,

ein LEFT JOIN müsste eigentlich reichen oder?

SELECT * FROM Zimmer z
LEFT JOIN BUCHUNG b on b.Zimmernummer=z.Zimmernummer
WHERE b.belegtvon>=Getdate() and b.belegtbis<='31.12.2011'
05.07.2011
mrmee 745 1 8
Bei dieser Select-Anweisung wird der Zeitraum an dem das Zimmer frei ist leider nicht zurückgegeben.
mazaka 05.07.2011
Stimmt, sry hab deine Frage nicht korrekt gelesen :)
mrmee 05.07.2011
0
Vielleicht hilft dir das ein wenig weiter. Lösung ist sicher nicht perfekt.

select *,
FREIVON_DAVOR = isnull((select convert(varchar,dateadd(D,1,BELEGTBIS),104) from BUCHUNG bu where bu.ZIMMERNUMMER=subsel1.ZIMMERNUMMER and convert(numeric,bu.BUCHUNGNR) = convert(numeric,subsel1.BUCHUNGNR) - 1),'01.01.2011'),
FREIBIS_DAVOR = convert(varchar,dateadd(D,-1,subsel1.belegtvon),104),
FREIVON_DANACH = convert(varchar,dateadd(D,1,subsel1.belegtbis),104),
FREIBIS_DANACH = isnull((select convert(varchar,BELEGTVON,104) from BUCHUNG bu where bu.ZIMMERNUMMER=subsel1.ZIMMERNUMMER and convert(numeric,bu.BUCHUNGNR) = convert(numeric,subsel1.BUCHUNGNR) + 1),'31.01.2011')
from (
select z.ZIMMERNUMMER,z.KATEGORIE,b.BUCHUNGNR,b.BELEGTVON,b.BELEGTBIS
from ZIMMER z
left join BUCHUNG b on b.ZIMMERNUMMER=z.ZIMMERNUMMER
) subsel1
05.07.2011
mrmee 745 1 8
0
Hallo und vielen Dank mrmee. Für einen Datensatz funktioniert das super. Ist es möglich auch Datensatzübergreifend die Ausgabe zu gestalten, wenn z.B. mehrere Buchungen für ein Zimmer stattfinden (siehe unten)?
05.07.2011
Also ich habs mit drei Datensätzen getestet. Zwei Buchungen f. Zimmer 1 und eine f. Zimmer 2 und es hat auch geklappt. Das Problem bei meiner Abfrage ist, das ich davon ausgehe, das die Buchungsnummer je Zimmer vergeben wird. (immer +1)
mrmee 05.07.2011
0
Hallo,

Schau doch mal doch mal im Internet nach "Islands and Gaps". Ist eine immer wieder auftretende Fragestellung. Wenn Du damit nicht weiter kommst helfe ich auch gerne bei der konkreten Implementierung.
06.07.2011
LutzJ 1,3k 1 8

Stelle deine Sql-Frage jetzt!