我们有一个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,并且在此情况下可以为空。
有谁知道我能怎么做才能通过OpenQuery做到这一点?
编辑:
我测试了Julien Date转换,肯定发生了一些麻烦,但我不知道是什么原因造成的。如果我在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获得相同的结果。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句