Donnerstag, 20. Juli 2017

Datumsspielereien (Teil 10) / Date gadgets (Part 10)

Beim Datum führen viele Wege nach Rom. Umwege, komplizierte Wege und kurze Wege.
Diese Erkenntnis hatte ich heute im Zusammenspiel mit der Generierung eines indizierbaren Datumsstring.

Ziel war eine Ausgabe in Form von YYYYMMDD auf Basis eines erfassten Datumfeldes.

Dummerweise ist der Fux mit reichlich Funktionen zur Datumsmanipulation und -verarbeitung ausgestattet, so dass es recht einfach ist, den Überblick zu verlieren.
DAY(), MONTH(), YEAR(), DATETIME(), DATE(), CTOD(), DTOT(), SET DATE TO und diverse weitere Funktionen die wir in den Datumsspielereien schon kennengelernt haben.

Die schnellste Methode den oben aufgezeigten Aufbau zu erhalten besteht im Einsatz von DTOC() mit dem ein Datum in einen Textstring gewandelt werden kann.
Wer jetzt glaubt, dass dafür noch weitere Funktionen nötig sind...

?CHRTRAN( DTOC( DATE() ) , [.] , [] ) && unvollständiges Beispiel :(

oder genauer so etwas oder vergleichbares (ergänzt aufgrund Matthias' Kommentar)

?SUBSTR(DTOC(DATE()),7)+SUBSTR(DTOC(DATE()),4,2)+SUBSTR(DTOC(DATE()),1,2)
?TRANSFORM(YEAR(DATE()))+PADL(MONTH(DATE()),2,[0])+PADL(DAY(DATE()),2,[0])

...irrt sich gewaltig :)

Irgendwann hat diese Funktion nämlich einen zweiten (optionalen) Parameter erhalten der einen indizierbaren Datumswert erzeugt.

* // returns the current date as YYYYMMDD
* // or YYMMDD, depending on your system configuration
?DTOC( DATE() , 1 )

Also: Vergesst komplizierte verschachtelte Funktionen. DTOC(,1) schafft es in minimaler Form.

Kommentare:

  1. Variante 1 ist aber auch gefährlich... nicht jeder hat das Windows Datumsformat auf die "Deutsche Variante" mit Punkten eingestellt... ich würd mich also niemals auf sowas wie Formatierungen verlassen!

    Außerdem: In Deutschland wird aus einem DTOC(DATE()) ein DDMMYYYY, also die verkehrte Reihenfolge!

    AntwortenLöschen
  2. Hi Matthias,
    es wird bei Mitgabe des 2. Parameter (=,1) explizit ein indizierbares Datum erzeugt. Dies bedeutet automatisch ein Format YYYYMMDD (oder, gem. Hilfe YYMMDD wenn die Systemeinstellungen dies vorgeben). Andernfalls wäre der erzeugte Datumsstring NICHT indizierbar. So etwas funktioniert zwangsweise nur im Format YYYYMMDD bzw. YYMMDD. Und ja, auch hier in Detuschland wird daraus YYYYMMDD, vorausgesetzt ,1 wird als 2. Parameter übergeben. Ein einfaches DTOC(DATE()) liefert das Format DD.MM.YY bzw. DD.MM.YYYY, je nach Einstellung. ;)

    AntwortenLöschen
  3. Hallo Tom,
    ja, das ist mir schon klar, ich arbeite ja seit 20 Jahren mit VFP... ich wollte ja nur drauf hinweisen, dass deine beiden Lösung eben NICHT gleichbedeutend sind, was der Artikel ja suggeriert hatte. Und dass ich offensichtlich einfache Ersetzungen wie etwa den Punkt im Datum für gefährlich halte, weil eben nicht jeder Windows-User das deutsche Datumsformat eingestellt hat. Das gilt auch für Zahlenformate, wo etwa die Schweizer den "'" als Tausender-Trenner verwenden, und keinen ".".
    Matthias

    AntwortenLöschen
  4. Deswegen hae ich auch zum besseren Verständnis zwei mögliche komplette Varianten im Post dazu gepackt. Der einfache CHRTRAN() war zugegebenermassen ein wenig unglücklich gewählt :)
    Da ich das in meiner ersten Anwort an Dich versäumt habe hole ich es an dieser Stelle nach: Danke für den Kommentar, dadurch konnte ich das Posting hoffentlich zum besseren hin korrigieren :)

    AntwortenLöschen
  5. Schön, konnte ich gerade gebrauchen.
    Weiter so

    AntwortenLöschen