reporting-services - Informix'||'运算符不在ODBC连接上工作

  显示原文与译文双语对照的内容
0 0

我在 ReportingServices 2005中构建一个报表,其中数据从Informix数据库中检索。 通过ODBC声明到数据库的连接。 以下是查询的简单版本:


select
 prodtype,
 familynum,
 family,
 sum(invested) invested,
 month(recevdate) month,
 year(recevdate) year,
 day(recevdate) day,
 'All Year' const
from
 sales_product
where
 (region not in ('15876','15852')) and
 (prodtype in ('4','7','50','1')) and
 (recevdate> = ('01/01/' || (year(?) - 1))) and
 (recevdate <= Date('12/31/' || (year(?) - 1)))
 group by 1,2,3,5,6,7

如果查看where子句,你将看到我正在从参数中获取年份,然后将它添加到字符串月份和日期。 这里的问题是'||'操作符直接在Informix中运行,而不是在ODBC上。 执行这里查询时,出现语法错误。 是否还有其他方法连接两个字符串?

时间: 原作者:

0 0

在这种情况下,我认为你最好的选择是使用 MDY() 函数而不是字符串串联:


SELECT prodtype, familynum, family,
 sum(invested) invested,
 month(recevdate) month,
 year(recevdate) year,
 day(recevdate) day,
 'All Year' const
 FROM sales_product
 WHERE (region NOT IN ('15876','15852'))
 AND (prodtype in ('4','7','50','1'))
 AND (recevdate BETWEEN MDY(1, 1, YEAR(?) - 1) AND MDY(12, 31, YEAR(?) - 1))
 GROUP BY 1,2,3,5,6,7

我认为? 占位值是一个完整的日期值,因此需要年份函数。 如果你传入了你感兴趣的确切年份编号,则可以简化查询:


SELECT prodtype, familynum, family,
 sum(invested) invested,
 month(recevdate) month,
 year(recevdate) year,
 day(recevdate) day,
 'All Year' const
 FROM sales_product
 WHERE (region NOT IN ('15876','15852'))
 AND (prodtype in ('4','7','50','1'))
 AND (recevdate BETWEEN MDY(1, 1,?) AND MDY(12, 31,?))
 GROUP BY 1,2,3,5,6,7

为什么字符串连接是'失败'。是 NOT 清除的。 然而,MDY() 函数的优点之一是它的参数与语言环境( 客户端和服务器区域设置) 无关。 问题的一个可能原因是,( 或者 NOT 设置) 报告服务设置的日期格式与你在查询中所强制的数据不同- 以及在直接执行查询时设置的不同。 这是个猜测一个合理但绝对肯定的猜测。 另一个可能是只传递引用日期一次,即使在查询的条件子句中使用了两次。 如果我们有错误消息,我们可以在故障源的源上更好地猜测。

原作者:
0 0

尝试使用+ 作为连接,或者类似于 strcat ( )

原作者:
0 0

我想我找到了解决问题的方法。 代替使用||操作符,我想使用替换函数。 所以,而不是 (recevdate> = Date('0101' + Year(?))) 我使用了 (recevdate> = Date(Replace('01/01/1900','1900',year(?)-1))) 它工作了,我仍然是为了更好的选择,但我将一直到这样,直到然后。

原作者:
0 0

给出了谓词中硬编码的01/01 和 12/31 值,为什么不使用:


YEAR(recevdate) = YEAR(?) - 1

这是不是最简单的方法?

原作者:
...