2016-11-22 1 views
0

Seit ein paar Tagen habe ich Probleme mit Daten in Firebird Abfrage. Ich versuche, 3 Daten in einem Feld in Select-Anweisung zu concat.Firebird Datum concatention Änderung Datumsformat

Aufbau dieses zu testen:

select 
data_wyst, data_sp, data_pop, 
data_wyst ||' | '|| data_sp ||' | '|| data_pop 
from rv_sp_dok 

Ergebnis ist:

2015-12-14; 2015-12-14; 2015-12-31; 14-DEC-2015 | 14-DEC-2015 | 31-DEC-2015 
2015-12-31; 2015-12-31; null; null 
2015-12-31; 2015-12-31; 2015-12-31; 31-DEC-2015 | 31-DEC-2015 | 31-DEC-2015 

Also, wenn ein Datum null ist dann ganz concat null ist, und das Datumsformat geändert von ‚YYYY-MM- DD 'bis' TT-MM-JJJJ '. Ergebnis concat sollte sein:

2015-12-14; 2015-12-14; 2015-12-31; 2015-12-14 | 2015-12-14 | 2015-12-31 
2015-12-31; 2015-12-31; null; 2015-12-31 | 2015-12-31 | 
2015-12-31; 2015-12-31; 2015-12-31; 2015-12-31 | 2015-12-31 | 2015-12-31 

Gibt es eine Möglichkeit Firebird zu verhindern Format zu ändern Datum, an Zeichenfolge gegossen (außer Prozedur Umwandlung date2string)?

// EDIT: Scheint beste Weg ist, Verfahren, das Datum zu Zeichenfolge konvertieren:

CREATE OR ALTER PROCEDURE DATE2STRING (DataIN Date) 
    returns (DataOut Varchar(10)) 
    AS 
     declare variable y Varchar(4); 
     declare variable m Varchar(2); 
     declare variable d Varchar(2); 
    begin 
    IF (DataIn is null) then 
    BEGIN 
     DataOut = ''; 
    END 
    ELSE 
    BEGIN 
     y = Substring(Extract(Year FROM DataIn) FROM 1 FOR 4); 
     m = Substring(Extract(Month FROM DataIn)+100 FROM 2 FOR 2); 
     d = Substring(Extract(Day FROM DataIn)+100 FROM 2 FOR 2); 

     DataOut = y || '-' || m || '-' || d; 
    END 
    SUSPEND; 
    end 

Antwort

3

Felder verketten, die Verwendung coalesce Funktion NULL s, dh

select 
data_wyst, data_sp, data_pop, 
COALESCE(data_wyst, '') ||' | '|| COALESCE(data_sp, '') ||' | '|| COALESCE(data_pop, '') 
from rv_sp_dok 

haben könnte Kontrollieren Sie das Datumsformat ohne externe Funktionen (date2string ist, AFAIK) können Sie die extract Funktion verwenden, dh

EXTRACT(YEAR FROM data_pop) ||'-'|| EXTRACT(MONTH FROM data_pop)||'-'|| EXTRACT(DAY FROM data_pop) 
+0

Nun, keine bessere Lösung für jetzt gefunden, so ist es ein Extrakt oder eine Prozedur, die extrahieren wird. Immer noch daran denken, warum Firebird dies ändern, wenn das Datum ist:/ – Jerry1333

+0

@ Jerry1333 Was ändern? Das Datumsformat der uncast-Felder wird ** clientseitig ** von der Anwendung behandelt, die dieses Datum zeigt, die Cast-Felder werden ** serverseitig ** in string konvertiert. Die Tatsache, dass der gesamte String null wird, wenn einer von ihnen null ist, liegt daran, dass SQL den Verkettungsoperator ('||') definiert. –