2016-02-05 50 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