Forum - Beitrag anzeigen

Datenbanken/SQL - schwierige SQL-Abfrage

Icon Pfeil Startseite Icon Pfeil Kategorie Icon Pfeil Suche

Icon Forum Beitrag vom 18.09.2007 08:22 (3574 Aufrufe)
Name: cornell
Titel: schwierige SQL-Abfrage
Inhalt: Hallo,

Ich habe 2 Beispiel-Tabellen unten angelegt. In der Tabelle Vermietungen sind die Häuser mit den Etagen die an bestimmten Tagen an einer bestimmten Uhrzeit vermietet sind. Unten in der Tabelle sind die Termine an denen die jeweiligen Etagen gesperrt sind und nicht ausgegeben werden sollen.
Über einen Url-Parameter rufe ich das Haus auf #URL.Haus#. Dann gebe ich die Vermietungen in dem bestimmten Monat aus.

Jetzt kommt mein Problem: Ich möchte in meiner Übersicht darstellen, dass nur die freien Zeiten angezeigt werden. D. h. wenn die Startzeit und die Endzeit jeweils 0 ist, dann wird der vermietete Tag nicht angezeigt und wenn die Zeit innerhalb der gesperrten Zeit fällt, soll die Vermietung auch nicht angezeigt werden.
Wenn die Zeit aber über die gesperrte Zeit hinausgeht, dann soll das Vermietete Haus mit der jeweiligen Etage angezeigt werden.

Wie sollte ich die SQL-Abfrage aufbauen. Ich zerbreche mir schon die ganze Zeit den Kopf und bekomme es einfach nicht hin. Wenn der ganze Tag ausfällt, d. h. wenn Sperrungen.Start EQ 0 und Sperrungen.Ende EQ 0, dann ist dass kein Problem, aber wenn die Zeiten angegeben sind dann haut es einfach nicht hin.

Tabelle Vermietungen:

ID | Haus | Kenn | Start | Ende | Wochentag
____________________________________________
1 1 101 900 1500 Mo
2 1 101 900 1500 Di
3 1 103 1200 1300 Mi
4 2 201 1400 1600 Do
5 2 202 1600 2100 Fr

Tabelle Sperrungen:

ID | Haus | Kenn |vonZeit|bisZeit| vonDatum | bisDatum
______________________________________________________
1 1 101 1000 1600 01.09.2007 01.09.2007
2 1 103 0 0 05.09.2007 08.09.2007
3 3 303 0 0 05.09.2007 08.09.2007
4 2 201 1200 1400 01.09.2007 01.09.2007
5 2 204 0 0 02.09.2007 02.09.2007




Mein Code:

Dieser Code durchläuft ein Loop und es wird jeder Tag eines Monats ausgegeben. Der jeweilige Tag ist #sqlDatum#.
#vWoche# ist der jeweilige Wochentag der dan dem Tag in der Übersicht zugewiesen wird.

<cfquery name="Sperrungen" datasource="dsn">
SELECT * FROM tbl_Sperrungen
WHERE (<cfqueryparam cfsqltype="cf_sql_timestamp" value="#sqlDatum#"> >= vonDatum AND
<cfqueryparam cfsqltype="cf_sql_timestamp" value="#sqlDatum#"> <= bisDatum)
and Haus = <cfqueryparam cfsqltype="cf_sql_varchar" value="#URL.Haus#">
Order by vonDatum
</cfquery>


<cfquery name="periodisch" datasource="dsn">
SELECT * FROM tbl_Haus
WHERE Wochentag = <cfqueryparam cfsqltype="cf_sql_varchar" value="#vWoche#" maxlength="2">
and Haus = <cfqueryparam cfsqltype="cf_sql_varchar" value="#URL.Haus#">
<cfif Sperrungen.recordcount NEQ 0>
<cfif #Sperrungen.vonZeit# EQ 0 AND #Sperrungen.bisZeit# EQ 0>
<cfloop query="Sperrungen">
Kenn <> <cfqueryparam cfsqltype="cf_sql_integer" value="#Sperrungen.Kenn#">
</cfloop>
<cfelse>

<!--- Ab hier weiß ich nicht mehr weiter --->

<cfloop query="Sperrungen">
OR (Start < <cfqueryparam cfsqltype="cf_sql_integer" value="#Sperrungen.vonZeit#">)
<cfif NOT parameterexists(URL.Vtk)>
AND (Kenn <> <cfqueryparam cfsqltype="cf_sql_integer" value="#Sperrungen.Kenn#">)
AND Haus = <cfqueryparam cfsqltype="cf_sql_varchar" value="#URL.Haus#">
</cfif>
AND (Ende > <cfqueryparam cfsqltype="cf_sql_integer" value="#Sperrungen.bisZeit#">)
</cfloop>
</cfif>
</cfif>
ORDER BY Ende, Start
</cfquery>


Bitte melden Sie sich kostenlos an, um eine Antwort auf diesen Beitrag zu erstellen.


Das deutsche ColdFusion-Forum cfml.de ist das Portal für Einsteiger und Experten zum Thema ColdFusion und der ColdFusion Markup Language (CFML).

© 2017 Webdesign & Hosting: CHC ONLINE Kassel | SOLVA Content-Management-System CMS
Urlaub-Angebote.de - Urlaub mit Bestpreis-Garantie buchen