AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Firebird Datums abfrage

Ein Thema von Walter Landwehr · begonnen am 15. Okt 2022 · letzter Beitrag vom 17. Okt 2022
Antwort Antwort
Walter Landwehr

Registriert seit: 28. Mär 2006
Ort: 32816 Schieder-Schwalenberg
397 Beiträge
 
Delphi 10.4 Sydney
 
#1

Firebird Datums abfrage

  Alt 15. Okt 2022, 13:13
Hallo Ich möchte aus eine Tabelle alle Datensätze wobei das Feld Jahr alle Werte des aktuellen Jahres enthält.

 SELECT * FROM tbl_buchhaltung B where B.jahr = aktuelles Jahr in etwa so wobei das aktuelle jahr das tatsächliche Jahr entspricht.
Walter Landwehr
Mfg

Walter
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.453 Beiträge
 
Delphi 12 Athens
 
#2

AW: Firebird Datums abfrage

  Alt 15. Okt 2022, 13:25
Und wo ist jetzt das Problem?
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von IBExpert
IBExpert

Registriert seit: 15. Mär 2005
672 Beiträge
 
FreePascal / Lazarus
 
#3

AW: Firebird Datums abfrage

  Alt 15. Okt 2022, 13:34
SELECT * FROM tbl_buchhaltung B where extract(year from B.jahr) = extract(year from current_date)

man kann das aber auch einfach über

SELECT * FROM tbl_buchhaltung B where b.jahr between '1.1.2022' and '31.12.2022'

beim zweiten weg würde ein eindex auf jahr benutzt werden, beim ersten weg nur ein expression index falls vorhanden
Holger Klemt
www.ibexpert.com - IBExpert GmbH
Oldenburger Str 233 - 26203 Wardenburg - Germany
IBExpert and Firebird Power Workshops jederzeit auch als Firmenschulung
  Mit Zitat antworten Zitat
Walter Landwehr

Registriert seit: 28. Mär 2006
Ort: 32816 Schieder-Schwalenberg
397 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Firebird Datums abfrage

  Alt 15. Okt 2022, 14:10
SELECT * FROM tbl_buchhaltung B where B.jahr = extract(year from current_date)

Das war der entscheidende Tipp.

Danke.
Walter Landwehr
Mfg

Walter
  Mit Zitat antworten Zitat
Benutzerbild von Jasocul
Jasocul

Registriert seit: 22. Sep 2004
Ort: Delmenhorst
1.354 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Firebird Datums abfrage

  Alt 17. Okt 2022, 07:27
SELECT * FROM tbl_buchhaltung B where b.jahr between '1.1.2022' and '31.12.2022'
Nur der Vollständigkeit halber:
Das funktioniert nur dann sicher, wenn es kein DateTime-Feld mit Time-Daten ist. Datensätze mit einem Datum am 31.12.2022 ab 00:00:01 Uhr werden von der Abfrage nicht berücksichtigt.
Peter
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.930 Beiträge
 
Delphi 12 Athens
 
#6

AW: Firebird Datums abfrage

  Alt 17. Okt 2022, 12:12
müsste "31.12.2022 23:59:59"
lauten
Andreas
Monads? Wtf are Monads?
  Mit Zitat antworten Zitat
Benutzerbild von IBExpert
IBExpert

Registriert seit: 15. Mär 2005
672 Beiträge
 
FreePascal / Lazarus
 
#7

AW: Firebird Datums abfrage

  Alt 17. Okt 2022, 22:15
SELECT * FROM tbl_buchhaltung B where b.jahr between '1.1.2022' and '31.12.2022'
Nur der Vollständigkeit halber:
Das funktioniert nur dann sicher, wenn es kein DateTime-Feld mit Time-Daten ist. Datensätze mit einem Datum am 31.12.2022 ab 00:00:01 Uhr werden von der Abfrage nicht berücksichtigt.
ja, aber ist noch ein wenig komplizierter, weil es auch noch unterschiede zwischen dialekt 1 und dialekt 3 geben kann

in dialekt 1 gibt es nur datentyp date, der entgegen seinem namen trotzdem ein timestamp ist, also auch die zeit beinhaltet

im dialekt 3 heisst der gleichartige timestamp, date ist dann nur datum, time nur die zeit

konstanten wie current_date kann man da immer drin unter bringen, im timestamp bzw alten dialekt 1 date datentyp ist das dann das akuelle datum mit 0:00 uhr morgens

wenn es also im o.a. beispiel ein timestamp gewesen wäre, dann wäre das anders (war es aber gar nicht, dachte ich wohl nur, aber walter hat da wohl nur die jahreszahl drin gespeichert, warum auch immer
das ann ein problem ist, das mit der akuellen Jahreszahl zu vergleichen, aber das ist ja gelöst)

AAusgehend davon das das feld im dialekt 3 (egal ob date oder timestamp) innerhalb der o.a. between anweisung abgefragt wird und
der Wert aus current_date beim speichern als default gesetzt wird, würde das passen.

konsequent für timestamps wäre also

...where datum >='1.1.2022' and datum <1.1.2023'

weil darüber auch alle timestamps am letzten Tag des Jahres dazwischen wäre inkl millisekunden vor neujahr, mit extract ist das aber eleganter lösbar.

für diejenigen, die sich fragen, wie das mit datetime/timestamp/etc überhaupt funktioniert und warum man da werte einfach addieren usw. kann,

es gibt immer einen Tag 0, bei firebird zB der 30.12.1899

seit dem sind so viel tage vergangen

select datediff(day,cast('30.12.1899' as date),current_date) from rdb$database

ergebnis 44851

wer also technisch das datum 17.10.2022 speichern will braucht nur diesen integer wert (date datentyp in dialekt 3 mit 4 Byte länge)

wer das als datetime speichern will, nimmt dafür ja den timestamp datentyp im fb dialekt 3 oder date im dialekt 1 (beide 8 Byte)
und für die uhrzeit wird der anteil, der vom tag vergangen ist, dann als nachkommstelle dahinter gesetzt

17.10.2022 12:00 = 44851,5
17.10.2022 18:00 = 44851,75

Der Engine intern ist es völlig egal, welcher tag/monat/jahr dahinter steht und ob es schaltjahr oder nicht ist. wenn man das
korrekt angeeigt haben will, wovon man ausgehen kann, dann wird die o.a. zahl eben in die Notation umgerechnet, mit der man
üblicherweise Zeitpunkt darstellt.

im Firebird sql kann ich daher auch datum + x rechnen usw. und wenn man als String dann zB
select * from tabelle where datum='17.10.2022'
abfragt, dann baut die engine aus dem string erst mal die zahl und wenn das laut encoding passt, wird das intern also die o.a. zahl.

wenn das nicht passt, wie zum Beispiel das hier, dann gibt es in Firebird eine exception
select * from tabelle where datum='30.02.2022'

das macht keineswegs jede Datenbank identisch, mysql war zum beispiel mal bekannt dafür, das man dort eben auch den 30.2. speichern konnte.

wie Jasocul schon schrieb, es muss immer berücksichtigt werden, was in den Datentypen drin sein könnte, damit ihr nicht mal irgendwann
für so was wie den lustigen exchange bug von anfang 2022 (However, this variable signed int32 can store only a maximum value of
2,147,483,647, which is less than the new date value of 2,201,010,001 for January 1st, 2022, at midnight) oder ein fieser Bug
beim Jahrausendwechsel in crystal reports, der sich auch da erst ende Februar im jahr 2000 auswirkte, weil die engine meinte,
das es kein Schaltjahr wäre, weil die Jahreszahl 2000 durch 100 teilbar ist, was die Regel dafür ist, das Schaltjahre ausfallen
können, dummerweise wusste man bei crystalreports dann wohl nichts von der ergänzenden Regel, das die 100 Jahr regel alle 400 Jahre
ausfällt, also im Jahr 2000 das doch kein ausfallendes Schaltjahr gab.

Crystal reports hat da aufgrund irgendwelcher eigenen Umrechnungsroutine also freundlicherweise schon auf allen Dokumenten am 29.2.2000
das Datum 1.3.2000 draufgedruckt. Das hat so manche Buchhaltungsabteilung hektisch werden lassen
Holger Klemt
www.ibexpert.com - IBExpert GmbH
Oldenburger Str 233 - 26203 Wardenburg - Germany
IBExpert and Firebird Power Workshops jederzeit auch als Firmenschulung
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:30 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz