【问题标题】:Informix - '||' operator not working over ODBC connectionInformix - '||'操作员未通过 ODBC 连接工作
【发布时间】:2010-09-29 13:22:00
【问题描述】:

我正在 Reporting Services 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。当我执行这个查询时,我得到一个语法错误。有没有其他方法可以连接两个字符串?

【问题讨论】:

    标签: reporting-services odbc reportingservices-2005 informix


    【解决方案1】:

    在这种情况下,我认为您最好的选择是使用 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
    

    我假设 ?占位符值是完整的 DATE 值,因此需要 YEAR 函数。如果您传入您感兴趣的确切年份,您可以简化查询:

    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
    

    至于为什么字符串连接'失败'......这还不清楚。但是,MDY() 函数的优点之一是它的参数是明确的,独立于语言环境(客户端和服务器语言环境)。造成问题的一个可能原因是 Reporting Services 设置(或不设置)的日期格式与您在查询中强制使用的格式不同 - 并且与您直接执行查询时设置的格式不同。这是一个猜测——一个似是而非的猜测,但绝不是确定的猜测。另一种可能性是您只传递了一次参考日期,即使它在查询的条件子句中使用了两次。如果我们给出了错误信息,我们也许可以更好地猜测问题的根源。

    【讨论】:

      【解决方案2】:

      尝试使用 + 作为 concat 或者类似 strcat() 的东西

      【讨论】:

      • 我尝试使用 +,但这给了我一个“字符到数字对话错误”。使用“strcat”我得到一个无法解决 strcat 错误。
      【解决方案3】:

      我想我找到了解决这个问题的方法......而不是使用 ||运算符我想到了使用替换功能。因此,我使用(recevdate &gt;= Date(Replace('01/01/1900','1900',year(?)-1))) 而不是(recevdate &gt;= Date('0101' + Year(?))),它起作用了。我仍然愿意接受更好的方法,但在那之前我会继续这样做。

      【讨论】:

        【解决方案4】:

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

        YEAR(recevdate) = YEAR(?) - 1
        

        这不是最简单的写法吗?

        【讨论】:

        • 从技术上讲,是的。但是,如果我想选择一年内的所有日期,这很有效。如果我想选择每季度的日期呢?为此,对季度开始和结束的月份和日期部分进行硬编码并让年份参数化会更容易。
        • 也许吧,但这不是原始问题中的内容,在这种情况下,年减 1 规则失效了。在任何情况下,MDY() 对你来说肯定比任何字符串操作方法都好:(recevdate >= MDY(?,1,?-1) AND recevdate
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-02-28
        • 1970-01-01
        • 2014-08-14
        • 2017-08-16
        • 2019-08-01
        • 2020-11-08
        • 1970-01-01
        相关资源
        最近更新 更多