为 WHERE 子句连接变量字符串

Connecting variable string for WHERE clause

如何在 Firebird 中为 where 子句连接变量字符串?

我有两个变量类型SMALLINT。这些变量在 while 循环中进行一次迭代后递增。

根据这些变量,我为 where-> 在 SQL 中的选择之间创建了 DATE,像这样(这是我无效的尝试):

 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

||string concatenator 运算符,但在表达式 g.GDATAP BETWEEN (:actyear || :actmonth || 01) 中你没有字符串,只有整数。 Firebird 不会为您进行类型转换。所以要让它工作,你必须转换为 (var)char,比如

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

您可能还需要添加日期分隔符,即

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

我不记得 Firebird 接受的格式了...

您似乎是在循环中构造这些日期,因此最好在循环之前初始化开始日期,然后使用 DATEADD() 函数将其递增所需的数量。