Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Firebird - Convert Timestamp function (https://www.delphipraxis.net/207083-firebird-convert-timestamp-function.html)

Int3g3r 23. Feb 2021 08:29

Datenbank: Firebird • Version: 2.5 • Zugriff über: IBExpert

Firebird - Convert Timestamp function
 
Guten Tag,

Kann mir jemand von euch sagen wie ihr in einem TIMESTAMP-Feld sucht ?
Ich versuche es gerade per like:

Code:
select h.GEBURTSDATUM from hund h
where h.GEBURTSDATUM like '%13%'
Mein Problem ist nun aber das ich im amerikanischen Format, mit like, suchen muss '2020-02-13' sonst wird nichts gefunden. Somit wollte ich eine Funktion schreiben die mir dies umwandelt.
Ist dies in Firebird 2.5 möglich ?

Ich habe es bereits mit einer Prozedur getestet, diese funktioniert aber nur so:
Code:
select * FROM CONVERT_DATE(cast('2021-02-01 10:10:10' as TIMESTAMP))
Folgender Code funktioniert nicht (da eine Prozedur wohl keine Funktion ist):

Code:
select h.GEBURTSDATUM from hund h
where CONVERT_DATE(h.GEBURTSDATUM) like '%13%'
// ERROR: FUNCTION unkown.
Gruss Int3g3r

markus888 23. Feb 2021 08:48

AW: Firebird - Convert Timestamp function
 
Like ist doch für Strings.

Nimm die Datumsfunktionen.

https://firebirdsql.org/refdocs/lang...c-extract.html

Int3g3r 23. Feb 2021 09:19

AW: Firebird - Convert Timestamp function
 
Zitat:

Zitat von markus888 (Beitrag 1483557)
Like ist doch für Strings.

Nimm die Datumsfunktionen.

https://firebirdsql.org/refdocs/lang...c-extract.html

Mein Suchfeld in der Applikation ist ein nomales TextEdit.
Darin will ich nach Datum und Text suchen.
Wie das untere Beispiel aufzeigt.
Ich verwende dort die extract Befehle bereits.

Kann doch nicht sein das ich jedes mal das Datum in meinem Landes-Format zusammensetzen muss.
Darum möchte ich für das eine Funktion schreiben.

Code:
SELECT h.*, a.VORNAME ||' '|| a.NACHNAME ||' '|| a.PLZ ||' '|| a.ORT as Besitzer from hund h
left join adresse a on a.ID = h.BESITZER_ID
where
LOWER(h.HUNDNAME) LIKE :suche or
extract(day from h.GEBURTSDATUM)||'.'||extract(month from h.GEBURTSDATUM)||'.'||extract(year from h.GEBURTSDATUM) LIKE :suche or
LOWER(h.CHIP_NR) LIKE :suche or
LOWER(h.ANMELDUNGSGRUND) LIKE :suche or
LOWER(a.VORNAME) LIKE :suche or
LOWER(a.Nachname) LIKE :suche or
LOWER(a.PLZ) LIKE :suche or
LOWER(a.Ort) LIKE :suche

Folgende Prozedur funktioniert, ist aber keine Funktion daher kann ich diese nicht im Join oben verwenden!:

Code:
create or alter procedure CONVERT_DATE (
    DATA timestamp not null)
returns (
    RESULT varchar(30))
as
begin
  if(DATA IS NULL) then
  begin
    result = NULL;
  end
  else
  begin
    result =  (LPAD(extract(DAY FROM DATA),2,'0') ||'.'||
                LPAD(extract(MONTH FROM DATA),2,'0') ||'.'||
                LPAD(extract(YEAR FROM DATA),4,'0') ||' '||
                LPAD(extract(HOUR FROM DATA),2,'0') ||':'||
                LPAD(extract(MINUTE FROM DATA),2,'0') ||':'||
                LPAD(extract(SECOND FROM DATA),7,'0'));
  end
  suspend;
end^

SET TERM ; ^

DeddyH 23. Feb 2021 09:32

AW: Firebird - Convert Timestamp function
 
Ich würde das Konzept noch einmal überdenken. Wieso sollte man nach Strings in einem Datum suchen? Was soll denn bei einer 2 herauskommen? Jeder 2., 12. und 22. jedes Monats + der komplette Februar und Dezember jedes Jahres + jedes Datum ab 1.1.2000 + 1992 + 1982 + ...?

Int3g3r 23. Feb 2021 10:40

AW: Firebird - Convert Timestamp function
 
Zitat:

Zitat von DeddyH (Beitrag 1483560)
Ich würde das Konzept noch einmal überdenken. Wieso sollte man nach Strings in einem Datum suchen? Was soll denn bei einer 2 herauskommen? Jeder 2., 12. und 22. jedes Monats + der komplette Februar und Dezember jedes Jahres + jedes Datum ab 1.1.2000 + 1992 + 1982 + ...?

Also bei meiner TextEingabe müssen mindestens 3 Zeichen eingegeben werden somit habe ich dies schon ein wenig eingeschränkt.
Ich habe mir halt überlegt das ich gerne z.b nach "12.02" suchen möchte und dann alle Resultate angezeigt werden. Dazu in einem einzigen Suchfeld wo ich auch direkt nach Text suche.
Bei sehr vielen Datensätzen ist dies sicherlich nicht ein gutes Konzept da gebe ich dir recht.
Werde mir dazu nochmals ein paar Gedanken machen

dataspider 23. Feb 2021 11:04

AW: Firebird - Convert Timestamp function
 
Zitat:

Zitat von Int3g3r (Beitrag 1483559)

Folgende Prozedur funktioniert, ist aber keine Funktion daher kann ich diese nicht im Join oben verwenden!:

Code:
create or alter procedure CONVERT_DATE (
    DATA timestamp not null)
returns (
    RESULT varchar(30))
as
begin
  if(DATA IS NULL) then
  begin
    result = NULL;
  end
  else
  begin
    result =  (LPAD(extract(DAY FROM DATA),2,'0') ||'.'||
                LPAD(extract(MONTH FROM DATA),2,'0') ||'.'||
                LPAD(extract(YEAR FROM DATA),4,'0') ||' '||
                LPAD(extract(HOUR FROM DATA),2,'0') ||':'||
                LPAD(extract(MINUTE FROM DATA),2,'0') ||':'||
                LPAD(extract(SECOND FROM DATA),7,'0'));
  end
  suspend;
end^

SET TERM ; ^

Das kannst du sehr wohl...

Code:
SELECT h.*, a.VORNAME ||' '|| a.NACHNAME ||' '|| a.PLZ ||' '|| a.ORT as Besitzer from hund h
left join adresse a on a.ID = h.BESITZER_ID
left join CONVERT_DATE(h.GEBURTSDATUM) d on 1 = 1
where
LOWER(h.HUNDNAME) LIKE :suche or
LOWER(h.CHIP_NR) LIKE :suche or
LOWER(h.ANMELDUNGSGRUND) LIKE :suche or
LOWER(a.VORNAME) LIKE :suche or
LOWER(a.Nachname) LIKE :suche or
LOWER(a.PLZ) LIKE :suche or
LOWER(a.Ort) LIKE :suche or
d.result like :suche
oder halt nur ins where:
Code:
(select result from CONVERT_DATE(h.GEBURTSDATUM)) like :suche
Frank


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:15 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