将OPENQUERY与Oracle数据库一起使用以查询日期范围

时间:2015-09-21 15:40:15

标签: sql-server oracle date openquery

我们有一个Oracle数据库,我们可以通过OpenQuery访问某些东西。您显然无法使用OleDB驱动程序直接在OpenQuery中进行日期比较,因此要解决此问题,您必须将日期转换为Julien日期并比较这些数字。我有以下查询,我们试图在MS SQL Server中执行此操作(GPROD是通过OleDb驱动程序的链接服务器):

if ($td->getAttribute('class') == 'h1'){/*do stuff...*/}

此查询不返回任何结果,但也不会产生错误。

如果我在Oracle SQL Developer中执行此查询,它可以正常工作并返回数千行:

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)) )')

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)) ) 字段的类型为DATE,如果重要,则可以为空。

有谁知道我可以通过OpenQuery实现这一目标?

修改

我对朱利安日期转换做了测试,肯定有些可疑,但我不知道造成它的原因。如果我在Oracle中执行它:

SHIP_DATE

我得到2457024

如果我在SQL Server上执行此操作:

select cast(to_number(to_char(to_date('01-JAN-2015') ,'J')) as numeric(10,0)) from dual

我得到1721443

1 个答案:

答案 0 :(得分:4)

我找到了问题的解决方案。通过指定日期的掩码,它将提供正确的结果。使用:

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

而不是

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

通过OpenQuery直接从Oracle获得相同的结果。