AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Firebird - Convert Timestamp function
Thema durchsuchen
Ansicht
Themen-Optionen

Firebird - Convert Timestamp function

Ein Thema von Int3g3r · begonnen am 23. Feb 2021 · letzter Beitrag vom 23. Feb 2021
Antwort Antwort
Int3g3r

Registriert seit: 28. Nov 2018
Ort: Schweiz
118 Beiträge
 
Delphi 10.3 Rio
 
#1

Firebird - Convert Timestamp function

  Alt 23. Feb 2021, 09:29
Datenbank: Firebird • Version: 2.5 • Zugriff über: IBExpert
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
  Mit Zitat antworten Zitat
markus888

Registriert seit: 23. Dez 2018
46 Beiträge
 
#2

AW: Firebird - Convert Timestamp function

  Alt 23. Feb 2021, 09:48
Like ist doch für Strings.

Nimm die Datumsfunktionen.

https://firebirdsql.org/refdocs/lang...c-extract.html
  Mit Zitat antworten Zitat
Int3g3r

Registriert seit: 28. Nov 2018
Ort: Schweiz
118 Beiträge
 
Delphi 10.3 Rio
 
#3

AW: Firebird - Convert Timestamp function

  Alt 23. Feb 2021, 10:19
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 ; ^
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#4

AW: Firebird - Convert Timestamp function

  Alt 23. Feb 2021, 10:32
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 + ...?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Int3g3r

Registriert seit: 28. Nov 2018
Ort: Schweiz
118 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: Firebird - Convert Timestamp function

  Alt 23. Feb 2021, 11:40
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
  Mit Zitat antworten Zitat
Benutzerbild von dataspider
dataspider

Registriert seit: 9. Nov 2003
Ort: 04539 Groitzsch
1.351 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Firebird - Convert Timestamp function

  Alt 23. Feb 2021, 12:04

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
Frank Reim

Geändert von dataspider (23. Feb 2021 um 12:23 Uhr)
  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 07:09 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