Использование OPENQUERY с базой данных Oracle для запроса диапазона дат
У нас есть база данных 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