使用 OPENQUERY 和 Oracle 数据库查询日期范围
Using OPENQUERY with an Oracle database to query a date range
我们有一个 Oracle 数据库,我们可以通过 OpenQuery 访问它来获取一些东西。您显然不能使用 OleDB 驱动程序直接在 OpenQuery 中进行日期比较,因此要解决此问题,您必须将日期转换为 Julien 日期并比较这些数字。我有以下查询,我们试图在 MS SQL 服务器中执行此查询(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)) )')
此查询returns没有结果但也没有产生错误。
如果我在 Oracle SQL Developer 中执行此查询,它工作正常并且 returns 数千行:
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 类型并且可以为空,如果这很重要的话。
有谁知道我可以做些什么来让这个通过 OpenQuery 工作?
编辑:
我测试了 Julien Date 转换,肯定有问题,但我不知道是什么原因造成的。如果我在 Oracle 中执行:
select cast(to_number(to_char(to_date('01-JAN-2015') ,'J')) as numeric(10,0)) from dual
我得到 2457024
如果我在 SQL 服务器上执行:
select * from OPENQUERY(GPROD, 'select cast(to_number(to_char(to_date(''01-JAN-2015'') ,''J'')) as numeric(10,0)) from dual')
我得到 1721443
我找到了解决问题的方法。通过为日期指定掩码,它将提供正确的结果。使用:
to_char(to_date('01-JAN-2015','DD-MON-YYYY') ,'J')
而不是
to_char(to_date('01-JAN-2015') ,'J')
通过 OpenQuery 和直接从 Oracle 给出相同的结果。
我们有一个 Oracle 数据库,我们可以通过 OpenQuery 访问它来获取一些东西。您显然不能使用 OleDB 驱动程序直接在 OpenQuery 中进行日期比较,因此要解决此问题,您必须将日期转换为 Julien 日期并比较这些数字。我有以下查询,我们试图在 MS SQL 服务器中执行此查询(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)) )')
此查询returns没有结果但也没有产生错误。
如果我在 Oracle SQL Developer 中执行此查询,它工作正常并且 returns 数千行:
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 类型并且可以为空,如果这很重要的话。
有谁知道我可以做些什么来让这个通过 OpenQuery 工作?
编辑:
我测试了 Julien Date 转换,肯定有问题,但我不知道是什么原因造成的。如果我在 Oracle 中执行:
select cast(to_number(to_char(to_date('01-JAN-2015') ,'J')) as numeric(10,0)) from dual
我得到 2457024
如果我在 SQL 服务器上执行:
select * from OPENQUERY(GPROD, 'select cast(to_number(to_char(to_date(''01-JAN-2015'') ,''J'')) as numeric(10,0)) from dual')
我得到 1721443
我找到了解决问题的方法。通过为日期指定掩码,它将提供正确的结果。使用:
to_char(to_date('01-JAN-2015','DD-MON-YYYY') ,'J')
而不是
to_char(to_date('01-JAN-2015') ,'J')
通过 OpenQuery 和直接从 Oracle 给出相同的结果。