Tag, Monat, Jahr eines Datums erhalten

Hallo,
ich bin immer noch Anfänger und beginne mit einem kleinen neuen Projekt.
Ich habe eine Tabelle, welche aus mehreren tausend Zeilen besteht. Abgesehen von einer ersten (pflichtmäßigen) Spalte mit ID, interessiert mich im Moment die erste eigentlich Spalte; sie enthält ein Datum, welches in jeder Zeile enthalten ist.

Nun möchte ich ein Formular machen, welches aus einer Tabelle besteht, welche ich mit drei Listenfeldern filtere.
Zu diesem Zweck soll es im Projekt eine kleine Tabelle geben bestehend aus einer Zeile; die Tabelle heißt Filterung. Die Spalten sind “Tag”, "Monat, “Jahr”.
Die Listenfelder sollten gespeist werden aus dem Datum der großen Haupttabelle; sie schreiben dann einen Wert (z.B. eine Monats-Zahl) in die eben erwähnte kleine Tabelle. Eine Abfrage stellt mir die Filterung dar, die auf diese Weise gewonnen wird, und das wiederum sollte im Formular der Tabelle sichtbar werden.

Das Problem:
Wie speise ich die Listenfelder. Also wie sage ich select irgendwas from soundso …grouped by … in Steuerelement Eigenschaften Listeninhalt (denn da muß der Code-Schnipsel hin, der mir Schwierigkeiten bereitet). Also anders gesagt: wie kann SQL z.B. den Tag eines Datums ermitteln?

Kann mir jemand auf die Sprünge helfen?
Vielen Dank,
Anselmo

Lade Dir das Handbuch runter. Da steht alles drin.

Das Ermitteln von Tag, Monat und Jahr ist abhängig von der benutzten Datenbank:

EXTRACT(MONTH FROM Datumswert)

gilt sowohl für die HSQLDB als auch für Firebird. Gleiches für DAY und YEAR.

Aber: Willst Du wirklich den Tag separat haben? Das heißt dann, dass Dir alles rausgegeben wird, was z.B. an einem 2. Tag in einem beliebigen Monat und Jahr liegt.

Vermutlich meinst Du stattdessen:

SELECT DISTINCT "Datum" FROM "Tabelle"
SELECT DISTINCT EXTRACT(MONTH FROM "Datum")||'/'||EXTRACT(YEAR FROM "Datum") FROM "Tabelle"
SELECT DISTINCT EXTRACT(YEAR FROM "Datum") FROM "Tabelle"

Mit der ersten Abfrage erhältst Du alle Tage, komplett mit Monat und Jahr. Mit der zweiten Abfrage eine Koppelung von Monat und Jahr und mit der dritten Abfrage nur das Jahr. Bei der Koppelung in der 2. Abfrage musst Du vermutlich wegen der Sortierung noch nachhelfen und den Monat zweistellig machen:

 SELECT DISTINCT RIGHT('0'||EXTRACT(MONTH FROM "Datum"),2)||'/'||EXTRACT(YEAR FROM "Datum") FROM "Tabelle"

Um so eine Abfrage in einem Listenfeld zu verwenden muss bei den Eigenschaften des Listenfeldes unter Daten → gebundenes Feld ‘0’ stehen. Die Feldzählung bei der Datenbank beginnt mit ‘0’. Alternativ muss die einfache Feldabfrage verdoppelt werden, da eine ‘1’ beim gebundenen Feld ein zweites Datenfeld erwartet.

Hallo Robert,

vielen Dank für die Antwort. Im Moment schaff ich es nicht, daß sich das Listenfeld füllt. Es gibt immer einen Error.

Zwischenfrage: selbst wenn die Formular-Quelle eine andere ist (nämlich die Minitabelle mit den zu filternden Angaben, also z.B. die Monats-Zahl), müßte das Listenfeld doch die gewünschte Quelle finden, sofern ich das, was nach "FROM" kommt, richtig schreibe. Das hatte ich auch in einem anderen Projekt mit Dir.

Und noch ein kleines Problem: da kommt das Jahr 2030 vor. Es wird aber interpretiert als 1930. Die Jahre unmittelbar davor sind ok.
Übrigens: ich will wirklich Tag, Monat, Jahr getrennt filtern. Einfach so! Nennen wir’s mal “Übung”. Die Idee kam mir. Es ist nicht uninteressant zu sehen, was am beispielsweise 25. beliebiger Monate ist.

Abfrage zu Listenfeldern: Stelle das gebundene Feld auf ‘0’, da dort sonst 2 Spalten erwartet werden. Ich arbeite das in die Antwort ein.

Zur Jahreszahl: Lass Dir einmal das Datum in Deinen Eingaben vierstellig anzeigen. Das klingt nämlich so wie die Interpretation aller Jahreszahlen, die zweistellig angegeben werden:

Optionen → LibreOffice → Allgemein → Jahr

Der Standard steht trotz nahendem Jahr 2030 immer noch bei 1930 bis 2029.

Sas gebundene Feld ist auf '0'. Leider klappt es trotzdem nicht. Ich dachte, vielleicht liegt es an der Datenmenge und ich muß ein wenig länger warten. Aber es kommen auch nach Wartezeit keine Inhalte!

bei "Optionen → LibreOffice → Allgemein → Jahr" gibt es bei mir nur die Möglichkeit, den unteren Wert von 1930 noch zu senken; es gibt aber keine Möglichkeit, das Jahr vierstellig anzeigen zu lassen

Ich habe den Wert für den Sprung bei mir problemlos auf 1940 hoch gesetzt. Wenn ich ‘39’ in der Tabellenkalkulation eingebe müsste das jetzt bei einem Datum auch zum Jahr 2039 werden.

Zur vierstelligen Jahreszahl in Base: Gehe auf den Tabellenkopf für das Datum. Rechte Maustaste → Spaltenformatierung. Dort dann die Anzeige mit vierstelliger Jahreszahl wählen. Geht auch in Abfragen, dort aber nur vorübergehend. Geht natürlich auch in Formularen.

Beides geklappt. Vielen Dank. Aber das eigentliche klappt noch nicht, obwohl es eigentlich eine einfache Aufgabe sein sollte. Mit Excel (oder auch Calc) ließe sich das, was ich will, in einer Minute machen. Ich schreib Dir mal schnell privat …