Zum Inhalt springen

Frage zu SQL-Aufgabe WHERE Datumsangaben


Empfohlene Beiträge

Liebes Forum,

ich stehe aktuell an einer Aufgabe, welche ich mit mehreren WHEREs lösen könnte - jedoch es vermutlich keine optimale Lösung ist.

Es gibt eine SQL Tabelle, in dieser ist das Aufnahmedatum in einer Spalte und das Entlassdatum des Patienten in der anderen Spalte. Syntax: 01.01.2020

Ich muss nun eine SELECT Anweisung schreiben, bei der nur die Einträge angezeigt werden, wo die Patienten im Februar 2020 da waren.

Ich könnte es theoretisch so lösen:

WHERE (YEAR(PatientenAufnahmeDatum) = 2020 OR YEAR(PatientenEntlassDatum) = 2020)

  AND (MONTH(PatientenAufnahmeDatum) = 02 OR MONTH(PatientenEntlassDatum) = 02)

Jedoch bezweifel ich, dass dies eine gute Lösung ist.... Hat da jemand einen rat, oder wie würdet ihr das lösen? Oder kann ich irgendwo sagen, WHERE ... >= 01.02.2020 and >= 31.02.2020 ....

Vielen Dank für eure Rückmeldungen!

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 10 Minuten schrieb SuperMarios:

Ich muss nun eine SELECT Anweisung schreiben, bei der nur die Einträge angezeigt werden, wo die Patienten im Februar 2020 da waren.

Im Februar anwesend heißt vor dem 1.3.2020 aufgenommen und nach dem 31.1.2020 entlassen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Die genaue Fragestellung heißt:

Erstellen Sie eine SQL-Anweisung, mit der Sie die Zimmerbelegungen für den Zeitraum Februar 2020 nach folgender Ergebnistabelle auflisten:

PatAufnahmedatum | PatEntlassdatum | ......

07.02.20 24.02.2020

01.02.2020 26.02.2020

26.02.2020 28.02.2020

Ich habe mich vielleicht falsch ausgedrückt. Ich glaube das in der Fragestellung auch die Patienten gemeint sind, die nur zwei Tage in dem Monat da waren. Und dann wäre der Patient ja früher entlassen worden..

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 1 Minute schrieb Tobi_8:

Eventuell mit LIKE ?

WHERE PatientenAufnahmeDatum LIKE '%.02.2021' AND PatientenEntlassDatum LIKE '%.02.2021' -->  Patienten die im Februar aufgenommen und wieder entlassen wurden

Ich denke fast richtig.... Was ist wenn einer am 31.01.2021 gekommen ist und am 10.02.2021 entlassen wurde? Vielleicht:

WHERE PatientenAufnahmeDatum LIKE '%.02.2021' OR PatientenEntlassDatum LIKE '%.02.2021'

Das könnte klappen...

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 1 Minute schrieb allesweg:

Wie wäre es, wenn du die vollständige Aufgabenstellung inklusive vollständiger Tabelle postest? Dann können wir auch auf passende Lösungswege hinweisen und müssen nicht rätselraten.

Das wollte ich vermeiden, da man Prüfungsaufgaben nicht veröffentlichen darf.. soweit ich weiß ....

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 43 Minuten schrieb allesweg:

Im Februar anwesend heißt vor dem 1.3.2020 aufgenommen und nach dem 31.1.2020 entlassen.

Das! Wobei eben beachtet werden muss, dass es sich um zwei Datumsfelder handelt.
Aber so wäre es vermutlich am simpelsten.

Die Abfrage kann z.B. aber auch sein, dass ENTWEDER das Aufnahmedatum im Februar 2020 (Also das Jahr 2020 und der Monat Februar ist) liegt ODER ( das Aufnahmedatum vor dem 1.2.2020 liegt UND das Entlassungsdatum nach dem 31.1.2020 liegt)

So würde ich es zumindest machen! Bei SQL ist es aber wie bei vielen anderen Dingen auch: Viele Wege führen zum Ziel!

Bearbeitet von Rienne
Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 1 Minute schrieb Whiz-zarD:

Die Aufgabe hatten wir doch schon mal:

 

Fast! Aber es ist richtig, es handelt sich um den 5. Handlungsschritt Aufgabe c der 2020 Sommer FIAE Abschlussprüfung. Bei meiner Frage hier, handelt es sich um Aufgabe b.

Es handelt sich um die selbe Tabelle Patienten_Aufenthalt, wie in der Aufgabe wo du geschrieben hast. Anbei die exakte Fragestellung.

frage.JPG

Link zu diesem Kommentar
Auf anderen Seiten teilen

Danke für die Rückmeldung, nun denke ich nochmal...

Wir brauchen alle Patienten, welche im Februar 2020 ein Zimmer hatten. Es kann sein, dass jemand im Januar 2020 in die Klinik kommt und am 01. Februar 2020 entlassen wird, dann war er auch im Februar da. Oder das jemand am 29. Februar 2020 in die Klinik kommt und egal wann entlassen wird.

Also...

Wenn Aufnahmedatum im Februar 2020 ist (Monat Februar und Jahr 2020)
ODER
Wenn Entlassdatum im Februar 2020 ist (Monat Februar und Jahr 2020)
ODER
Wenn Aufnahmedatum vor dem Februar 2020 ist UND Entlassdatum nach dem Februar 2020

dann hatte der Patient ein Zimmer, oder?

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 1 Stunde schrieb Rienne:

@Tobi_8 und was ist dann bei der Lösung mit Patienten, die z.B. am 1.1.2020 gekommen sind und am 31.4.2020 entlassen wurden?

Wird von der IHK nicht verlangt, wenn ich mir die Ergebnistabelle und die Lösung so anschau...

Ansonsten vielleicht:

WHERE NOT Entlassdatum < '01.02.2020' AND NOT Anfangsdatum >= '01.03.2020'

Link zu diesem Kommentar
Auf anderen Seiten teilen

Mich würde interessieren, ob die Handreichung ein CONVERT() hergibt.

Denn ohne das, ein CAST() o.Ä., kann hier doch eigentlich nur eine halbgare oder unnötig komplizierte Lösung bei rauskommen. Was aber nicht funktionieren wird ist, dass du hier die Typen DATE und VARCHAR vergleichst, dieses ">= '01.03.2020'" halte ich entsprechend für Unsinn.

Wenn du kein CAST(), kein CONVERT() und auch kein DATEPART() hast, wirst du wohl mit DAY(), MONTH() oder YEAR() arbeiten müssen. Also alles raussuchen das vor Ort war als MONTH(date) = 2 und YEAR(date) = 2020 war. Vielleicht ließe sich da auch etwas mit einem BETWEEN() machen, habe immer das Gefühl, dass die IHK das besonders gerne sieht..

 

Bearbeitet von Visar
typo
Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 58 Minuten schrieb Visar:

Mich würde interessieren, ob die Handreichung ein CONVERT() hergibt.

Denn ohne das, ein CAST() o.Ä., kann hier doch eigentlich nur eine halbgare oder unnötig komplizierte Lösung bei rauskommen. Was aber nicht funktionieren wird ist, dass du hier die Typen DATE und VARCHAR vergleichst, dieses ">= '01.03.2020'" halte ich entsprechend für Unsinn.

Wenn du kein CAST(), kein CONVERT() und auch kein DATEPART() hast, wirst du wohl mit DAY(), MONTH() oder YEAR() arbeiten müssen. Also alles raussuchen das vor Ort war als MONTH(date) = 2 und YEAR(date) = 2020 war. Vielleicht ließe sich da auch etwas mit einem BETWEEN() machen, habe immer das Gefühl, dass die IHK das besonders gerne sieht..

 

Prinzipiell hast du recht... wir wissen aber nicht ob der Datentyp der Daten DATE oder String ist. Mit Date würde >='01.03.2020' (Standard wäre YYYY-MM-DD, kann man aber umstellen, denke ich) sehr wohl funktionieren... ich bin davon ausgegangen dass die Daten in DATE angegeben sind.

Lustig ist, dass du meinst, man könne das Datum nicht mit >= operieren, weil es ein String ist und im nächsten Abschnitt willst du das Datum in die Funktionen MONTH(DATE) und YEAR(DATE) geben... 

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 2 Stunden schrieb Tobi_8:

Wird von der IHK nicht verlangt, wenn ich mir die Ergebnistabelle und die Lösung so anschau...

Doch klar! Wenn nach Patienten gefragt wird, die im Februar anwesend waren, müssen auch die berücksichtigt werden, die vor Februar kamen und nach Februar gingen.

Die Abfrage

vor 4 Stunden schrieb Tobi_8:
vor 6 Stunden schrieb SuperMarios:

WHERE PatientenAufnahmeDatum LIKE '%.02.2021' OR PatientenEntlassDatum LIKE '%.02.2021'

des sollte passen

ist damit falsch. Zumal man, meine ich, bei Datumsfeldern nicht mit LIKE abfragen kann.

vor 8 Minuten schrieb Tobi_8:

ich bin davon ausgegangen dass die Daten in DATE angegeben sind.

Was denn nun? XD

vor einer Stunde schrieb Visar:

Vielleicht ließe sich da auch etwas mit einem BETWEEN() machen, habe immer das Gefühl, dass die IHK das besonders gerne sieht..

Da es sich um zwei Datumsfelder (Aufnahme und Entlassung) handelt, fiele mir keine Lösung mit BETWEEN ein.

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 14 Minuten schrieb Rienne:

Doch klar! Wenn nach Patienten gefragt wird, die im Februar anwesend waren, müssen auch die berücksichtigt werden, die vor Februar kamen und nach Februar gingen.

Erstellen Sie eine SQL-Anweisung, mit der Sie die Zimmerbelegungen für den Zeitraum Februar 2020 nach folgender Ergebnistabelle auflisten:

vor 14 Minuten schrieb Rienne:

Die Abfrage ist damit falsch. Zumal man, meine ich, bei Datumsfeldern nicht mit LIKE abfragen kann.

Stimmt, des mit LIKE würde nicht funktionieren. Ist Schwachsinn und kann ich gerne löschen... my bad. Ich meine nur es mal in einer Lösung der IHK gesehen zu haben und hab es seitdem auch teilweise genutzt... wird glaub ich auch nicht als falsch bewertet soweit ich mich entsinne... werde es mir aber abgewöhnen :D 

 

Würde 

vor 2 Stunden schrieb Tobi_8:

WHERE NOT Entlassdatum < '01.02.2020' AND NOT Anfangsdatum >= '01.03.2020'

deiner Meinung nach nun funktionieren oder nicht? (Wenn man davon ausgeht es ist DATE)

 

Edit:

nvm man kanns nicht mehr löschen... dann wird es wohl aus didaktischen Gründen erhalten bleiben :D 

Bearbeitet von Tobi_8
edit
Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 52 Minuten schrieb Tobi_8:

Lustig ist, dass du meinst, man könne das Datum nicht mit >= operieren, weil es ein String ist und im nächsten Abschnitt willst du das Datum in die Funktionen MONTH(DATE) und YEAR(DATE) geben... 

Ja, Moment mal.. ich habe in erster Linie (wenn auch nicht besonders großartig ausgeführte) Bedenken geäußert, dass das Vergleichen unterschiedlicher Datentypen problematisch sein könnte. Mag anders sein, war halt der erste Gedanke.

Bei CONVERT() o.Ä. hatte ich den String im Sinn, den du da die ganze Zeit im Anfangsdatum >= 'dd.mm.yyyy' reinprügeln möchtest. MONTH() und YEAR() wären in einem Subselect, einem Where oder wie auch immer auf die Spalten angewendet worden. TL; DR Weshalb sollte ein 

SELECT anfang, ende
FROM aufgabe
WHERE MONTH(anfang) = 2 AND MONTH(ende) = 2
  AND YEAR(anfang) = 2020 AND YEAR(ende) = 2020;

...oder Ähnliches jetzt noch gleich ein Ding der Unmöglichkeit sein? 

Das werde ich bei Spalten mit Typ DATE doch noch machen dürfen. 😕 Hab ja auch nicht gesagt, dass ich da den String wittere, da ging es mir um das was du zum Vergleichen reingeben willst... 😭

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

SELECT	...
FROM	...
WHERE 	AufnahmeDatum < DATE '2020-03-01'
        AND EntlassDatum > DATE '2020-02-01'

Es werden die weggefiltert, die nach dem Februar 2020 aufgenommen und die, die vor dem Februar 2020 entlassen worden sind. Übrig bleiben die, die in den Betten lagen.

Wenn es mit DATE nicht gemacht werden darf:

SELECT	...
FROM	...
WHERE 	(MONTH(AufnahmeDatum) < 3 AND YEAR(AufnahmeDatum) = 2020)
        AND (MONTH(EntlassDatum) >= 2 AND YEAR(EntlassDatum) = 2020)

 

Bearbeitet von Whiz-zarD
Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 2 Stunden schrieb Whiz-zarD:

SELECT ... FROM ... WHERE (MONTH(AufnahmeDatum) < 3 AND YEAR(AufnahmeDatum) = 2020) AND (MONTH(EntlassDatum) >= 2 AND YEAR(EntlassDatum) = 2020)

Ein kleiner Fehler hat sich noch eingeschlichen: Beim Aufnahmedatum sollte das Jahr kleiner gleich 2020 sein und nicht nur gleich 2020.

vor 2 Stunden schrieb Whiz-zarD:

SELECT ... FROM ... WHERE AufnahmeDatum < DATE '2020-03-01' AND EntlassDatum > DATE '2020-02-01'

Ich glaube DATE benötigt es im klassischen SQL gar nicht. Lediglich die Formatierung muss passen. D.h. die Abfrage müsste lauten:

SELECT ... FROM ... WHERE AufnahmeDatum <'2020-03-01' AND EntlassDatum >= '2020-02-01'

Nachzulesen hier: https://www.w3schools.com/sql/sql_dates.asp

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...