SuperMarios Geschrieben 27. April 2021 Teilen Geschrieben 27. April 2021 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! Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
MartinSt Geschrieben 27. April 2021 Teilen Geschrieben 27. April 2021 welches DBMS? Postgresql kennt netterweise ein "overlaps" für Date-Ranges. 😉 SuperMarios reagierte darauf 1 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
SuperMarios Geschrieben 27. April 2021 Autor Teilen Geschrieben 27. April 2021 Da es sich um eine Fragestellung der Abschlussprüfung zum Fachinformatiker handelt, kann ich leider keine Rückfragen stellen. 😋 Ich denke, dass hier mit normalen SQL gearbeitet werden soll - welches von jedem DBMS unterstützt wird. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
allesweg Geschrieben 27. April 2021 Teilen Geschrieben 27. April 2021 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. Enno und SuperMarios reagierten darauf 2 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Tobi_8 Geschrieben 27. April 2021 Teilen Geschrieben 27. April 2021 Eventuell mit LIKE ? WHERE PatientenAufnahmeDatum LIKE '%.02.2021' AND PatientenEntlassDatum LIKE '%.02.2021' --> Patienten die im Februar aufgenommen und wieder entlassen wurden SuperMarios reagierte darauf 1 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
SuperMarios Geschrieben 27. April 2021 Autor Teilen Geschrieben 27. April 2021 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.. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
SuperMarios Geschrieben 27. April 2021 Autor Teilen Geschrieben 27. April 2021 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... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
allesweg Geschrieben 27. April 2021 Teilen Geschrieben 27. April 2021 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. SuperMarios und Enno reagierten darauf 2 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
SuperMarios Geschrieben 27. April 2021 Autor Teilen Geschrieben 27. April 2021 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ß .... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Rienne Geschrieben 27. April 2021 Teilen Geschrieben 27. April 2021 (bearbeitet) 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 27. April 2021 von Rienne SuperMarios reagierte darauf 1 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Whiz-zarD Geschrieben 27. April 2021 Teilen Geschrieben 27. April 2021 (bearbeitet) Ist das nicht diese Aufgabe? Bearbeitet 27. April 2021 von Whiz-zarD SuperMarios reagierte darauf 1 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
SuperMarios Geschrieben 27. April 2021 Autor Teilen Geschrieben 27. April 2021 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
SuperMarios Geschrieben 27. April 2021 Autor Teilen Geschrieben 27. April 2021 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? allesweg reagierte darauf 1 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Tobi_8 Geschrieben 27. April 2021 Teilen Geschrieben 27. April 2021 vor 2 Stunden schrieb SuperMarios: WHERE PatientenAufnahmeDatum LIKE '%.02.2021' OR PatientenEntlassDatum LIKE '%.02.2021' des sollte passen allesweg reagierte darauf 1 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Rienne Geschrieben 27. April 2021 Teilen Geschrieben 27. April 2021 (bearbeitet) @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? Bearbeitet 27. April 2021 von Rienne SuperMarios, Visar, Bitschnipser und 1 Weiterer reagierten darauf 2 2 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
allesweg Geschrieben 27. April 2021 Teilen Geschrieben 27. April 2021 Wir stochern in Teilangaben und bei der Veröffentlichung einzelner Aufgaben gab es meines Wissens noch keine Probleme. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Tobi_8 Geschrieben 27. April 2021 Teilen Geschrieben 27. April 2021 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' Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Visar Geschrieben 27. April 2021 Teilen Geschrieben 27. April 2021 (bearbeitet) 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 27. April 2021 von Visar typo Tobi_8 reagierte darauf 1 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
SuperMarios Geschrieben 27. April 2021 Autor Teilen Geschrieben 27. April 2021 Laut dem Belegsatz wird hier DATE, DAY, MONTH, TODAY, WEEKDAY, YEAR, DATEDIFF zur Verfügung gestellt. BETWEEN() wird hier nicht genannt, ob man das dann verwenden darf - ist eine gute Frage. DATEPART(), CONVERT(), CAST() wird NICHT genannt. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Tobi_8 Geschrieben 27. April 2021 Teilen Geschrieben 27. April 2021 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... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Rienne Geschrieben 27. April 2021 Teilen Geschrieben 27. April 2021 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. Tobi_8 reagierte darauf 1 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Tobi_8 Geschrieben 27. April 2021 Teilen Geschrieben 27. April 2021 (bearbeitet) 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 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 Bearbeitet 27. April 2021 von Tobi_8 edit Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Visar Geschrieben 27. April 2021 Teilen Geschrieben 27. April 2021 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... 😭 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Whiz-zarD Geschrieben 27. April 2021 Teilen Geschrieben 27. April 2021 (bearbeitet) 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 27. April 2021 von Whiz-zarD SuperMarios reagierte darauf 1 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Rienne Geschrieben 27. April 2021 Teilen Geschrieben 27. April 2021 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 SuperMarios und Whiz-zarD reagierten darauf 1 1 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
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.