SQL Datumsvergleich

norbert_pdm

Cadet 2nd Year
Registriert
März 2021
Beiträge
25
Hall, hallo alle,

ich habe die Aufgabe, das Datum aus einer Datenbank mit dem Ersten des Vormonates zu vergleichen.
Im Augenblick, mache ich da so:
SQL:
IF(
    STR_TO_DATE(DATE_FORMAT(DATE_ADD(now(), INTERVAL -1 MONTH), '01.%m.%Y'), '%d.%m.%Y') < STR_TO_DATE(DATE_FORMAT(tbl_kinder_bewill_start, '%d.%m.%Y'),'%d.%m.%Y') ,
    DATE_FORMAT(tbl_kinder_bewill_start, '%d.%m.%Y'),
    DATE_FORMAT(DATE_ADD(now(), INTERVAL -1 MONTH), '01.%m.%Y')
) AS Abrechnung_Start

Das liefert genau das, was es soll...
Aber: Ich frag mich, ob das nicht 'eleganter' geht... ?
Hat jemand dazu vlt eine Idee?

Viel Grüße,
Norbert
 
"SQL", "Berechnung" und "schön" in einen Satz zu schreiben grenzt an eine schwere Straftat :D

Ich frage mich allerdings, warum du Datum -> String -> Datum konvertierst, anstatt einfach direkt mit dem Datum zu arbeiten?

Wenn du eine Spalte vom Typ "DATE" hast, kannst du damit direkt arbeiten. Z.B. SELECT * FROM myTable WHERE myDateColumn < '2021-04-14'. Die Datenbank kümmert sich schon darum, dass alles korrekt interpretiert und verarbeitet wird.
 
Frage: Warum konvertierst du die Daten erst in einen string und anschließend wieder in ein Datum, um sie zu vergleichen? Warum vergleichst du nicht direkt die Daten? Und warum gibst du die Daten als string aus, nicht direkt als Datum?
 
benneq schrieb:
"SQL", "Berechnung" und "schön" in einen Satz zu schreiben grenzt an eine schwere Straftat
:D:D:D
BTW: Ich dachte, dass es sinnvoller ist, diesen Vergleich aus der Datenbank zu holen, statt ihn in PHP 'rumzufrickeln'... Nicht gut?

Zu der Frage: Ich will halt mit dem ersten des Vormontes vergleichen....
Na klar ist das doppelt gemoppelt... Deswegen ja auch meine Frage...
Wie kann man sonst folgenden Vergleich machen:

01.Vormonat.DiesesJahr < BestimmtesDatum

machen?
 
zumal die lexikographische Sortierung auch eigentlich nur mit einem ISO 8601 basierten Format wirklich sicher funktioniert, also sowas wie YYYY-MM-DD

Eleganter aussehen wuerde es evtl. wenn du sowas wie eine UDF oder Stored Procedure nimmst. Je nach DB gibt es sowas ja. Aber um das Rechnen kommst du wohl trotzdem nicht rum, gibt nicht fuer alles schon built-in Functions - was klar ist
 
Stimme zu, die String Comparison funktioniert idR. nicht mit deutschem Datumformat (TT-MM-JJJJ), nur mit dem wohletablierten YYYY-MM-DD. Solange Du also darauf bestehst, dass ein STR_TO_DATE() mit '%d.%m.%Y' vorgenommen wird, bleibt der 01.01.2021 < 31.12.2020 (zum Vergleich: 2020-12-31 < 2021-01-01).
 
  • Gefällt mir
Reaktionen: pcBauer
norbert_pdm schrieb:
BTW: Ich dachte, dass es sinnvoller ist, diesen Vergleich aus der Datenbank zu holen, statt ihn in PHP 'rumzufrickeln'... Nicht gut?
Du kannst deine Logik im Prinzip komplett in SQL bauen mit nur einem minimalistischen PHP Wrapper drum herum... ;)
Die beste Lösung
  • funktioniert,
  • erfüllt alle Anforderungen und
  • ist simpel.
 
  • Gefällt mir
Reaktionen: Fombu
norbert_pdm schrieb:
Ich dachte, dass es sinnvoller ist, diesen Vergleich aus der Datenbank zu holen, statt ihn in PHP 'rumzufrickeln'... Nicht gut?
Ich würde sagen, dass das persönliche Präferenz ist.

Ich persönlich mache sowas lieber in meinem Appliklationscode. Aber wenn's eine Schul/Uni Aufgabe ist, kann's auch gut sein, dass man dann Punktabzug bekommt ;)
 
Da du mit dem Vormonat vergleichen musst, ist es immer eine (unschöne) Rechnerei in SQL. Musst halt praktisch jedes Datum auf den 01. des Monats konvertieren und beim vergleich einen Monat abziehen.

Die SUBDATE-Funktion sollte dir helfen.




Falls du Faul bist :D -> http://sqlfiddle.com/#!9/2e84c3/7

Schön sieht es nicht aus. Vielleicht geht es auch noch etwas besser. Zumindest bleibt dein Datum so ein Datum und du sparst dir ggF. auftretende Probleme durch die Zwischenkonvertierung in einen String.
 
Datum vergleicht man mit Datum. Das ist DATUM, kein TEXT. Nur weil man das als Text ausgegeben kriegt IST es doch kein Text!

SELECT * FROM tabelle WHERE date_incoming > date_outgoing tut exakt das Richtige.

Außer man nimmt DBMS die kein Datumsformat verstehen wie SQLITE. Da hat man einfach nur die Arschkarte (weil Datum als Text gespeichert wird und faktisch irgendwas eingetragen werden kann).
 
abcddcba schrieb:
zumal die lexikographische Sortierung auch eigentlich nur mit einem ISO 8601 basierten Format wirklich sicher funktioniert, also sowas wie YYYY-MM-DD
Danke dir!
Dieser Tipp war es... :-)

Ich hab den Code kürzen können... :-)
Code:
IF(
    DATE_FORMAT(DATE_ADD(now(), INTERVAL -1 MONTH), '%Y-%m-01') < tbl_kinder_bewill_start,
    DATE_FORMAT(tbl_kinder_bewill_start, '%d.%m.%Y'),
    DATE_FORMAT(DATE_ADD(now(), INTERVAL -1 MONTH), '01.%m.%Y')
) AS Abrechnung_Start

Da vergleicht er dann tatsächlich Datumswerte... :-)
 
  • Gefällt mir
Reaktionen: Phrasendreher
Ohne String-Konvertierung:
Code:
LAST_DAY(curdate() - interval 2 month) + interval 1 day
LAST_DAY
 
  • Gefällt mir
Reaktionen: Hayda Ministral
Zurück
Oben