2016-02-05 61 views
0

如何在Firebird中連接where子句的變量字符串?連接WHERE子句的變量字符串

我有兩個變量類型SMALLINT。這些變量在while循環中迭代一次後遞增。

從這些變量創建DATEwhere - >在SQL中,像這樣的選擇之間(這是我的無效嘗試):

yearmin=extract (year from DATAMIN); 
yearmax=extract (year from DATAMAX); 
monthmin=extract (month from DATAMIN); 
monthmax=extract (month from DATAMAX); 
aktyear=rokmin; 
actmonth=monthmin; 

while (actyear<=yearmax and actmonth<=monthmax) DO   
BEGIN 
SELECT 
[...] 
WHERE (g.GDATAP BETWEEN (:actyear || :actmonth || 01) AND (:actyear || :actmonth || 30)) 
[...] 

    INTO :Zaw,:Sum; 
actyear=actyear+1; 
actmonth=actmonth+1; 
SUSPEND; 
end 
+0

這是什麼':actyear'語法?我一直在使用SQL Server一段時間,我從來沒有遇到過它......另外,SUSPEND似乎不是SQL Server關鍵字。你確定你正在爲你的DMBS使用正確的SQL語法(或者你的問題被正確標記)? – Heinzi

+0

您必須構建一個可以轉換爲日期的字符串文字。 – jarlh

+0

actyear是臨時變量,更改每一個迭代,用於創建sql where子句。 – Toster

回答

2

||string concatenator運營商,但在表達g.GDATAP BETWEEN (:actyear || :actmonth || 01)你不」沒有字符串但是整數。火鳥不會爲你做類型轉換。因此,要使其工作,你必須強制轉換爲(VAR)字符,像

cast(:actyear as varchar(4)) || cast(:actmonth as varchar(2)) || '01' 

您可能有添加日期分隔符太,即

cast(:actyear as varchar(4)) || '-' || cast(:actmonth as varchar(2)) || '-01' 

我不記得格式火鳥接受關閉我的頭頂...

它看起來像你在循環中構造這些日期,所以最好在循環前初始化開始日期,然後使用DATEADD()函數將其增加所需的數量。

+0

感謝您的定位,它會嘗試以不同的方式處理它。 – Toster