Oracle查询未返回预期结果 - 并且通过sql链接服务器执行时的结果不同

时间:2012-03-03 13:19:05

标签: sql oracle tsql linked-server

我有这个查询

select * from openQuery(hades,"select to_char(T$STDT,'dd-Mon-YYYY') stdt,to_char(T$TDAT,'dd-Mon-YYYY') tdat
    ,fdG2J(T$TDAT)-fdG2J(t$stdt) diff,T$DISC 
    ,fdG2J(Sysdate) nSysD
    ,fdG2J(t$stdt) nStdt
    ,fdg2J(t$tdat) nTdat
    from BAAN.TTDSLS031020 
where T$CUNO='000022' and TRIM(T$CPGS)='1AA00'
--and fdG2J(sysdate) between fdG2J(t$stdt) and fdG2J(t$stdt) 
");

并返回以下结果(并非注释掉where子句的最后一行)。

STDT        TDAT        DIFF        T$DISC  NSYSD   NSTDT   NTDAT
01-Mar-12   11-Mar-12   10010       40  2455990063  2455988061  2455998071
02-Mar-12   02-Mar-12   0           50  2455990063  2455989062  2455989062
06-Mar-12   11-Mar-12   5005        60  2455990063  2455993066  2455998071
11-Mar-12   11-Mar-12   0           70  2455990063  2455998071  2455998071
18-Jul-39   01-Jan-12   2907496166  80  2455990063  2465988199  5373484365
15-Dec-85   01-Jan-12   2817496016  80  2455990063  2555988349  5373484365

当我应用注释的子句时,查询返回没有结果(通过sql2008链接服务器)

当我从Sql Developer(Oracle)运行相同的查询时

我得到了第一行

有趣的是: a)为什么在不同环境中执行时会返回不同的结果(尽管运行查询的服务器是同一台服务器)? b)。为什么不在条款之间不返回预期的结果?

2 个答案:

答案 0 :(得分:3)

我不知道fdG2J()的入侵功能,但在BETWEEN子句中,您对两者使用相同的函数调用和参数值。因此,两者都返回相同的值,fdG2J(sysdate)需要完全相等,而不是在范围点之间。

and fdG2J(sysdate) between fdG2J(t$stdt) and fdG2J(t$stdt) 
-- -                            ^^^^^^^^  Same as ^^^^^^^^

也许你打算:

and fdG2J(sysdate) between fdG2J(t$stdt) and fdG2J(T$TDAT) 

答案 1 :(得分:0)

select * from openQuery(hades,"select to_char(T$STDT,'dd-Mon-YYYY') stdt,to_char(T$TDAT,'dd-Mon-YYYY') tdat
    ,fdG2J(T$TDAT)-fdG2J(t$stdt) diff,T$DISC 
    ,fdG2J(Sysdate) nSysD
    ,fdG2J(t$stdt) nStdt
    ,fdg2J(t$tdat) nTdat
    from BAAN.TTDSLS031020 
where T$CUNO='000022' and TRIM(T$CPGS)='1AA00'
and fdG2J(sysdate) between fdG2J(t$stdt) and fdG2J(T$TDAT) 
");