Werte aus MYSQL intern auswerten

oeko

Mitglied
Hallo,

ich habe Belegungsdaten, die in der Form ...AAAAAABBBA... (365 Zeichen für das Jahr, A für frei und B für belegt) in meiner Datenbank gespeichert sind. Nun möchte ich Belegungsanfragen an die Datenbank stellen, ob Unterkünfte zum Zeitpunkt x frei sind. Bisher gehe ich davon aus, alle relevanten Datensätze auszulesen und mit einer PHP-Funktion zu überprüfen, ob Zeichen x - y an den Stellen b - g jeweils A für frei entspricht.

Meine Frage ist, ob es vielleicht auch möglich ist, dies direkt in der Datenbank erfolgen zu lassen ohne eine Kontrolle mit PHP zu machen?

Hoffe, mich einigermaßen verständlich ausgedrückt zu haben.

Grüße
oeko
 
Bsp für die Tage 288-293.
Code:
SELECT (INSTR(SUBSTRING(belegungsfeld FROM 288 FOR 5), "B") = 0) AS frei
FROM table
WHERE unterkunft = myUnterkunft

Irgendwie so sollte es gehen. Im SELECT-Teil nehem ich zuerst mit SUBSTR() den Zeichenabschnitt für die betroffene Dauer heraus. mit INSTR() prüfe ich, ob ein "B" für belegt darin enthalten ist. Wennn icht, dann gibt mir INSTR() eine 0 zurück und ich weiss, dass die Unterkunft in dieser Zeit frei ist. Das neue Feld ´frei´ gibt so 1 für frei, 0 für besetzt zurück.
 
Hi,

vielen Dank. Das klappt! Eine Frage noch, wie müsste de Abfrage lauten, wenn für belegt 2 Buchstaben stehen könnten (A und O).

Folgende Versuche scheiterten:

Code:
SELECT (
INSTR( SUBSTRING( j2009
FROM 0
FOR 4 ) , "A","O" ) AS frei 
FROM belegung

oder

Code:
SELECT (
INSTR( SUBSTRING( j2009
FROM 0
FOR 4 ) , "A"), (
INSTR( SUBSTRING( j2009
FROM 0
FOR 4 ) , "O") AS frei 
FROM belegung

Viele Grüße
Oeko


Bsp für die Tage 288-293.
Code:
SELECT (INSTR(SUBSTRING(belegungsfeld FROM 288 FOR 5), "B") = 0) AS frei
FROM table
WHERE unterkunft = myUnterkunft

Irgendwie so sollte es gehen. Im SELECT-Teil nehem ich zuerst mit SUBSTR() den Zeichenabschnitt für die betroffene Dauer heraus. mit INSTR() prüfe ich, ob ein "B" für belegt darin enthalten ist. Wennn icht, dann gibt mir INSTR() eine 0 zurück und ich weiss, dass die Unterkunft in dieser Zeit frei ist. Das neue Feld ´frei´ gibt so 1 für frei, 0 für besetzt zurück.
 
Code:
SELECT ((INSTR(periode, "B") + INSTR(periode, "C")) = 0 ) AS frei
FROM
	(SELECT SUBSTRING(belegungsfeld FROM 288 FOR 5) AS periode
	FROM table
	WHERE unterkunft = myUnterkunft)

Zerst ein subquery, damit wir den substring() nur einmal haben.
Der instr() gibt ja die position des ersten gefundenen Zeichens zurück. Erfolgreich ist, wenn dies 0 ist (also nicht besetzt). Somit können wir einfach 2 instr() zusammenzählen und sollten imme ncoh auch 0 kommen.
 
Hallo,

danke für die Hilfe. Leider bekomme ich immer eine Fehlermeldung ausgewiesen. "You have an error in your SQL syntax." Eine Idee?

Viele Grüße
oeko
 
Hmmm. Clevere Kodierung, 365 Tage durch Buchstaben zu markieren.
Wie sieht es aber mit Schaltjahren aus?
 
Aus Gründen der Normalisierung würde ich dir von diesem Weg abraten und dir raten, dass du einfach für jede Belegung einen Datensatz anlegst mit Anfangs- und Enddatum.
 
Aus Gründen der Normalisierung würde ich dir von diesem Weg abraten und dir raten, dass du einfach für jede Belegung einen Datensatz anlegst mit Anfangs- und Enddatum.
Ich kann mich eigentlich nur anschließen. Diese Kodierung verkompliziert das ganze doch (nicht nur wegen der Schaltjahre).
Was ist, wenn du in zwei Wochen auf die Idee kommst, noch eine weitere Belegungsart zu vergeben?
Deine Abfragen werden damit immer unübersichtlicher.
 
Das ist richtig, allerdings bekomme ich die Belegungsdaten in diesem Format von meinem Kooperationspartner vorgegeben. Dies sind ca. 10.000 Datensätze. Sollte ich diese tatsächlich täglich umwandeln?
 
Zurück