У нас есть база данных Oracle, к которой мы обращаемся через OpenQuery для некоторых вещей. Очевидно, вы не можете сравнивать даты непосредственно в OpenQuery с помощью драйвера OleDB, поэтому, чтобы обойти это, вам нужно преобразовать даты в даты Жюльена и сравнить эти числа. У меня есть следующий запрос, который мы пытаемся выполнить в MS SQL Server (GPROD — это связанный сервер через драйвер OleDb):
SELECT *
FROM OPENQUERY(GPROD, '
SELECT *
FROM ORD_HDR_HST
WHERE (cast(to_number(to_char(SHIP_DATE ,''J'')) as numeric(10,0)) >= cast(to_number(to_char(to_date(''01-JAN-2015'') ,''J'')) as numeric(10,0)) AND
cast(to_number(to_char(SHIP_DATE ,''J'')) as numeric(10,0)) <= cast(to_number(to_char(to_date(''21-SEP-2015'') ,''J'')) as numeric(10,0)) )')
Этот запрос не возвращает результатов, но и не выдает ошибки.
Если я выполняю этот запрос в Oracle SQL Developer, он отлично работает и возвращает тысячи строк:
SELECT *
FROM ORD_HDR_HST
WHERE (cast(to_number(to_char(SHIP_DATE ,'J')) as numeric(10,0)) >= cast(to_number(to_char(to_date('01-JAN-2015') ,'J')) as numeric(10,0)) AND
cast(to_number(to_char(SHIP_DATE ,'J')) as numeric(10,0)) <= cast(to_number(to_char(to_date('21-SEP-2015') ,'J')) as numeric(10,0)) )
Поле SHIP_DATE
имеет тип DATE и может принимать значение NULL, если это имеет значение.
Кто-нибудь знает, что я могу сделать, чтобы заставить это работать через OpenQuery?
Изменить:
Я проверил преобразование даты Жюльена, и определенно происходит что-то подозрительное, но я не знаю, что его вызывает. Если я выполню это в Oracle:
select cast(to_number(to_char(to_date('01-JAN-2015') ,'J')) as numeric(10,0)) from dual
Я получаю 2457024
Если я выполню это на SQL Server:
select * from OPENQUERY(GPROD, 'select cast(to_number(to_char(to_date(''01-JAN-2015'') ,''J'')) as numeric(10,0)) from dual')
Я получаю 1721443
OpenQuery
. Я не могу использовать представления (мы используем представления для некоторых вещей). Через представление выполнение занимает более 40 секунд (в таблице много строк). ЧерезOpenQuery
, если бы это действительно сработало, это заняло бы секунду или около того (время, необходимое для прямого выполнения в Oracle). - person Pete   schedule 21.09.2015OPENQUERY
и 2457024 напрямую в Oracle. - person Pete   schedule 22.09.2015