Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   SQLite SQL für Alter anzeigen gibt Null zurück (https://www.delphipraxis.net/211952-sqlite-sql-fuer-alter-anzeigen-gibt-null-zurueck.html)

dstein 25. Nov 2022 14:26

Datenbank: SQLite • Version: 3.x • Zugriff über: native

SQLite SQL für Alter anzeigen gibt Null zurück
 
Liste der Anhänge anzeigen (Anzahl: 1)
Moin,
Das nachfolgend Script soll das Alter eines Datums anzeigen.
Ich bekomme keinen Kopf daran warum ich bei dem SQLite Script immer NULL zurück bekomme.
Wo ist mein Fehler?

SELECT
name,
GebDate,
strftime('%Y', date('now')),
strftime('%m', date('now')),
strftime('%d', date('now')),
CASE
WHEN strftime('%m', date('now')) > strftime('%m', date(GebDate)) THEN strftime('%Y', date('now')) - strftime('%Y', date(GebDate))
WHEN strftime('%m', date('now')) = strftime('%m', date(GebDate)) THEN
CASE
WHEN strftime('%d', date('now')) >= strftime('%d', date(GebDate)) THEN strftime('%Y', date('now')) - strftime('%Y', date(GebDate))
ELSE strftime('%Y', date('now')) - strftime('%Y', date(GebDate)) - 1
END
WHEN strftime('%m', date('now')) < strftime('%m', date(GebDate)) THEN strftime('%Y', date('now')) - strftime('%Y', date(GebDate)) - 1
END AS Age
FROM test;

hhcm 25. Nov 2022 14:34

AW: SQLite SQL für Alter anzeigen gibt Null zurück
 
Wahrscheinlich weil date(Gebdate) NULL ist.
SQLite interessiert sich nicht wirklich für Typen.

Trag Gebdate mal als "1954-11-11" anstatt als "11.11.1954" in die Tabelle ein

dstein 25. Nov 2022 14:41

AW: SQLite SQL für Alter anzeigen gibt Null zurück
 
Ich glaube nicht, wenn du das Zeige_Alter.sql ausführst sind die Felder gefüllt.
GebDatum wird in der Spalte angezeigt Siehe Result_Null.png
Ich vermute ein Fehler im Script finde ihn aber nicht.

dstein 25. Nov 2022 14:45

AW: SQLite SQL für Alter anzeigen gibt Null zurück
 
Du hast mich auf eine Idee gebracht und es muß tatsächlich etwas mit dem Wert zutun haben.
Denn wenn ich nur den Wert zerlege kommt auch nur NULL zurück.

SELECT
name,
GebDate,
strftime('%Y', date('GebDate')),
strftime('%m', date('GebDate')),
strftime('%d', date('GebDate'))
from test

hhcm 25. Nov 2022 14:46

AW: SQLite SQL für Alter anzeigen gibt Null zurück
 
Wie gesagt, trag das Datum mal als "yyyy-mm-dd" ein, dann gehts auch.

dstein 25. Nov 2022 14:53

AW: SQLite SQL für Alter anzeigen gibt Null zurück
 
Liste der Anhänge anzeigen (Anzahl: 1)
Die Schreibweise hat keinen Einfluß.
Aber es muß etwas mit dem Datumsfeld zutun haben, denn now kann ich testweise zerlegen aber Gebdatum nicht.
Da kommt auch immer NULL zurück. Ich habe keine Ahnung was hier schief läuft.

SELECT
name,
strftime('%Y', date('now'))as NowDate,
GebDate,
strftime('%Y', date('GebDate')),
strftime('%m', date('GebDate')),
strftime('%d', date('GebDate'))
from test

hhcm 25. Nov 2022 14:58

AW: SQLite SQL für Alter anzeigen gibt Null zurück
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hmm..

hhcm 25. Nov 2022 15:05

AW: SQLite SQL für Alter anzeigen gibt Null zurück
 
Code:
STRFTIME('%Y', GebDate)
nicht

Code:
STRFTIME('%Y', DATE(GebDate))

himitsu 25. Nov 2022 16:06

AW: SQLite SQL für Alter anzeigen gibt Null zurück
 
SQL-Code:
SELECT
  name,
  GebDate,
  strftime('%Y', date('now')),
  strftime('%m', date('now')),
  strftime('%d', date('now')),
  CASE
    WHEN strftime('%m', date('now')) > strftime('%m', date(GebDate)) THEN
      strftime('%Y', date('now')) - strftime('%Y', date(GebDate))
    WHEN strftime('%m', date('now')) = strftime('%m', date(GebDate)) THEN
      CASE
        WHEN strftime('%d', date('now')) >= strftime('%d', date(GebDate)) THEN
          strftime('%Y', date('now')) - strftime('%Y', date(GebDate))
        ELSE
          strftime('%Y', date('now')) - strftime('%Y', date(GebDate)) - 1
      END
    WHEN strftime('%m', date('now')) < strftime('%m', date(GebDate)) THEN
      strftime('%Y', date('now')) - strftime('%Y', date(GebDate)) - 1 
    ELSE ... -- dieses ELSE gibt es nicht, also NULL <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  END AS Age
FROM test;
Wozu überhaupt das innere CASE?
Weil Code zu unübersichtlich und nicht bemerkt?


außerdem ist es unnötig unübersichtlich, da Vieles doppelt/mehrfach vorkommt.
SQL-Code:
SELECT
  name,
  GebDate,
  strftime('%Y', date('now')),
  strftime('%m', date('now')),
  strftime('%d', date('now')),
  strftime('%Y', date('now')) - strftime('%Y', date(GebDate))
  - CASE
      WHEN strftime('%m', date('now')) > strftime('%m', date(GebDate)) THEN
        0
      WHEN strftime('%m', date('now')) = strftime('%m', date(GebDate)) THEN
        CASE
          WHEN strftime('%d', date('now')) >= strftime('%d', date(GebDate)) THEN
            0
          ELSE
            -1
        END
      WHEN strftime('%m', date('now')) < strftime('%m', date(GebDate)) THEN
        -1
      ELSE
        0  -- neues/fehlendes ELSE --> irgendwas - NULL = NULL
    END AS Age
FROM test;

TigerLilly 25. Nov 2022 16:34

AW: SQLite SQL für Alter anzeigen gibt Null zurück
 
SQLite hat zwar Datentypen, aber keine Prüfung darauf + intern wird alles als String gespeichert. Dein GebDat wird zwar ein Datum enthalten, aber es wird unterschiedliches Format aufweisen. Dehalb wird die Konvertierung manchmal fehlschlagen.

Prüfe mal, was tatsächlich in GebDat drinsteht + ob das immer als gültiges (für die Konvertierung!) Datum erkannt wird.


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:40 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz