为 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()
函数将其递增所需的数量。
如何在 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()
函数将其递增所需的数量。