Использование 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


person Pete    schedule 21.09.2015    source источник
comment
Пожалуйста, исправьте свои теги. Этот вопрос не связан с sql-сервером!   -  person Jorge Campos    schedule 21.09.2015
comment
Это связано с SqlServer и Oracle.   -  person Pete    schedule 21.09.2015
comment
Что ж, извините. На самом деле это связано с sql-сервером, поскольку оракул НЕ имеет функции/процедуры OPENQUERY. Лучше всего создать представления в обеих базах данных оракула и вызвать их. Вы также можете создавать ссылки на базы данных   -  person Jorge Campos    schedule 21.09.2015
comment
Этот конкретный запрос должен выполняться через OpenQuery. Я не могу использовать представления (мы используем представления для некоторых вещей). Через представление выполнение занимает более 40 секунд (в таблице много строк). Через OpenQuery, если бы это действительно сработало, это заняло бы секунду или около того (время, необходимое для прямого выполнения в Oracle).   -  person Pete    schedule 21.09.2015
comment
Вы пытаетесь выполнить запрос в базе данных оракула, обращаясь к базе данных sqlserver (удаленно) или наоборот? Я имею в виду, подключены ли вы к базе данных оракула, пытаясь выполнить OPENQUERY на сервере sql, или вы подключены к серверу sql, пытаясь выполнить openquery с базой данных оракула?   -  person Jorge Campos    schedule 21.09.2015
comment
Обновите вопрос, чтобы уточнить, что первый запрос выполняется в MS SQL Server.   -  person Pete    schedule 21.09.2015
comment
Просто любопытно, что произойдет, если вы пропустите преобразование в число и просто вернете числовое значение в виде символа?   -  person Brad D    schedule 21.09.2015
comment
@BradD Я получаю те же результаты, что и выше, только в виде символа, а не числа. То есть 1721443 с использованием OPENQUERY и 2457024 напрямую в Oracle.   -  person Pete    schedule 22.09.2015


Ответы (1)


Я нашел решение проблемы. Указав маску для даты, она обеспечит правильные результаты. С использованием:

to_char(to_date('01-JAN-2015','DD-MON-YYYY') ,'J') 

вместо

to_char(to_date('01-JAN-2015') ,'J') 

Тот же результат дает через OpenQuery и напрямую из Oracle.

person Pete    schedule 22.09.2015