2016-11-22 33 views
0

幾天後,我在Firebird查詢中遇到了日期問題。我試圖在select語句中的一個字段中連接3個日期。火鳥日期連接更改日期格式

建立了這個測試吧:

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

結果是:

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 

所以,當一個日期爲null,則整個CONCAT是空的,日期格式從「YYYY-MM-改變DD'到'DD-MM-YYYY'。結果CONCAT應該是:

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 

有什麼辦法來防止火鳥從轉換爲字符串時,改變日期格式(除了過程轉換date2string)?

//編輯: 似乎最好的辦法是過程,將日期轉換爲字符串:

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 

回答

3

要Concat的可能有NULL的使用coalesce功能領域,即

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

要控制日期格式而不使用任何外部功能(其中date2string是,AFAIK)可以使用extract功能,即

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

好了,現在沒有找到更好的解決方案,所以它的提取或程序,將做提取。 還在想爲什麼火鳥改變這個日期時投:/ – Jerry1333

+0

@ Jerry1333改變什麼? uncast字段的日期格式由應用程序處理客戶端**,顯示該日期,轉換字段將**服務器端**轉換爲字符串。如果其中一個爲null,則整個字符串變爲空的事實是因爲SQL定義了連接運算符('||')。 –