sql-server - 将 OPENQUERY 与 Oracle 数据库结合使用来查询日期范围

标签 sql-server oracle date openquery

我们有一个 Oracle 数据库,我们可以通过 OpenQuery 访问该数据库以获取一些信息。显然,您无法使用 OleDB 驱动程序直接在 OpenQuery 中进行日期比较,因此要解决此问题,您必须将日期转换为 Julien 日期并比较这些数字。我有以下查询,我们尝试在 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

最佳答案

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

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

而不是

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

通过 OpenQuery 和直接从 Oracle 给出相同的结果。

关于sql-server - 将 OPENQUERY 与 Oracle 数据库结合使用来查询日期范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32699299/

相关文章:

sql - 我的中频条件在哪里?

oracle - 如何关闭 Oracle 密码过期功能?

javascript - 日期.parse(2/4/2011 9 :34:48 AM)

php - 选择日期大于当前日期的每个用户最近日期的行

SQL Server 函数返回问号而不是实际结果

c# - 带有读/写变量的 SSIS 脚本任务不会在 ScriptResults.Failure 上停止

java - 使用 Hibernate 和 SQL Server 2008 的问题

sql-server - SQL Server 2012 分析服务模式

node.js - Node : What happen if not close oracle connection

date - 如何在VB中以mm/dd/yyyy格式打印日期