Informix - '||' оператор не работает через соединение ODBC - PullRequest
2 голосов
/ 29 сентября 2010

Я создаю отчет в 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. Когда я выполняю этот запрос, я получаю синтаксическую ошибку. Есть ли другой способ объединить две строки?

Ответы [ 4 ]

1 голос
/ 29 сентября 2010

В данных обстоятельствах я думаю, что ваш лучший выбор - использовать функцию 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, отличается от того, который вы принудительно задаете в своем запросе, и отличается от того, который устанавливается при непосредственном выполнении запроса.Это предположение - правдоподобное, но отнюдь не окончательное предположение.Другая возможность состоит в том, что вы передаете ссылочную дату только один раз, даже если она используется дважды в условии условия запроса.Если бы мы получили сообщение об ошибке, мы могли бы лучше угадать источник проблемы.

0 голосов
/ 30 сентября 2010

Учитывая жестко закодированные значения 01/01 и 12/31 в предикате, почему бы не использовать:

YEAR(recevdate) = YEAR(?) - 1

Разве это не самый простой способ написать это?

0 голосов
/ 29 сентября 2010

Я думаю, что нашел решение этой проблемы ... Вместо использования || Оператор, который я думал об использовании функции замены. Итак, вместо (recevdate >= Date('0101' + Year(?))) я использовал (recevdate >= Date(Replace('01/01/1900','1900',year(?)-1))), и это сработало. Я все еще открыт для лучшего способа сделать это, но я буду заниматься этим до тех пор.

0 голосов
/ 29 сентября 2010

Попробуйте использовать + для concat или, может быть, что-то вроде strcat ()

...