SQL-Frage

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
Mr_C
User
Beiträge: 14
Registriert: Samstag 15. Dezember 2018, 13:32

Hallo,

ich benötige einmal die Hilfe bei der Bildung eines SQL-Befehls.

Folgende Ausgangstabelle:
  • [Name
  • Urlaub start
  • Urlaub ende
  • Anzahl Urlaubstage
  • Strandurlaub
  • Städtereise
Nun würde ich gerne filtern wollen. Wer ist aktuell im Urlaub? Also bei welchem Datensatz befindet sich das heutige Datum im Bereich (Urlaub start / Urlaub ende).
Die gefundenen Datensätze würde ich gerne zählen. Also würde ich eine Count-Variante nutzen wollen. Im Zweifel könnte ich aber auch via Python die Anzahl der Datensätze zählen.

Habt ihr einen Ansatz, denen ich wohl nutzen kann?

Danke!
Benutzeravatar
__blackjack__
User
Beiträge: 13117
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Mr_C: Das ist ja eher SQL und keine Python-Frage. Und in SQL wirklich ziemlich grundlegend. Was hast Du denn schon und wo ist das konkrete Problem dabei? Du brauchst ein SELECT, eine Aggregatfunktion zum zählen, den Tabellennamen, eine Funktion die das aktuelle Datum ermittelt, einen Test ob das zwischen Start und Ende liegt, und das war's ja auch schon. Für das aktuelle Datum gibt es im SQL-Standard eine Funktion. Da musst Du eventuell schauen ob Dein verwendetes DBMS die bietet oder ob man da eine andere nicht-standardisierte Funktion hat.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Start <= Jetzt AND Jetzt <= Ende

Die Tage sind redundant, die errechnen sich trivial aus Ende – Start. Und die beiden Spalten für die Art sind auch ungünstig, da nimmt man eine Spalte, und deren Werte sind dann eben Städtereise, Strandurlaub oder dann auch mal Weltraumurlaub. Ohne das man and der Tabelle Schrauben muss.
Benutzeravatar
__blackjack__
User
Beiträge: 13117
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Wobei es für „zwischen Start und Ende inklusive“ auch eine Möglichkeit in SQL gibt wo man `Jetzt` nicht zweimal hinschreiben muss.

Anzahl der Urlaubstage ≠ Anzahl der Tage zwischen Start und Ende. Nicht jeder Tag zählt als Urlaubstag, dazu müsste man die regulär vereinbarten Wochenarbeitstage und die Feiertage kennen.

Mir fehlt in der Tabelle noch ein Primärschlüssel (der hoffentlich nicht der Name ist) und anstelle des Namens würde man bei einem DB-Entwurf in Normalform auch eine ID in eine Namenstabelle erwarten.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Kann man in SQL auch einfach verketten? Also a < b< c? Oder welcher Operator fällt mir gerade nicht ein?

Mit den Tagen hast du natürlich recht 🤦‍♂️
Benutzeravatar
__blackjack__
User
Beiträge: 13117
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Dir fällt ``… BETWEEN … AND …`` gerade nicht ein. 🙂
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Puhh. Das habe ich auch noch nie benutzt. Ob ich jetzt "BETWEEN" lieber tippe als zweimal <= ...
Benutzeravatar
__blackjack__
User
Beiträge: 13117
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Es ist trotzdem kürzer weil Du musst ja `Jetzt` zweimal tippen und das tatsächliche `Jetzt` ist ein längerer Funktionsname. Das sind 11 Zeichen mehr!!!1elf! 😀
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
naheliegend
User
Beiträge: 439
Registriert: Mittwoch 8. August 2018, 16:42

Habe BETWEEN auch noch nie benutzt. Fühlt sich einfach falsch an :D
__backjack__: "Jemand der VB oder PHP kann, der also was Programmieren angeht irgendwo im negativen Bereich liegt (...)"
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

@naheliegend: für Dich fühlt es sich falsch an, wenn Du für die Frage ob etwas ZWISCHEN Start und Ende liegt in einer Abfrage BETWEEN zu benutzen?
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

BETWEEN ist meiner Meinung nach tatsächlich etwas problematisch weil nicht so deutlich ist ob es inklusive order exclusive Start und Ende ist. Das ist deutlicher wenn man einfach `start <= dt AND dt <= end` nutzt, was äquivalent zu between wäre.
Antworten