Oracle

Oracle Lag() on date 輸出錯誤數據

  • August 12, 2021

Oracle DB 19 - Sql 開發者 19 - NLS DD-MON-RR

我有一張桌子

ID      NAME    EFFDT       NODE    PARENT
SHA     DEPT    01-JAN-01   A10200  TOP
SHA     DEPT    04-JAN-11   A10200  X10200
SHA     DEPT    01-JAN-14   A10200  TOP
SHA     DEPT    04-JAN-14   A10200  TOP

我正在使用Lag()函式來創建時間段

這是我的查詢:

select id
      ,name
      ,effdt
      ,lag(effdt-1,1,null) over (partition by node order by effdt desc) AS EFFDTEND
      ,node
      ,parent
FROM
TABLE
ORDER BY node, effdt

結果 :

ID      NAME    EFFDT       EFFDTEND    NODE    PARENT
SHA     DEPT    01-JAN-01   31-DEC-09   A10200  TOP
SHA     DEPT    04-JAN-11   31-DEC-12   A10200  X10200
SHA     DEPT    01-JAN-14   03-JAN-14   A10200  TOP
SHA     DEPT    04-JAN-14   05-JAN-14   A10200  TOP

看看第一行,我得到31-DEC-09了代替03-JAN-1131-DEC-12代替31-DEC-13

一切正常後01-JAN-14

我已經嘗試過:

  1. effdt使用TO_DATE()NLS 模板進行全部轉換
  2. 使用間隔 -1 天代替effdt-1
SELECT 
TO_DATE('04-JAN-11', 'DD-MON-RR')-1
FROM DUAL;

返回:

03-JAN-11

更新

這裡要求的是小提琴連結:小提琴

在 Fiddle 和 18c 上,錯誤不會重現

select * from v$version;
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production

任何的想法 ?

我真的不知道為什麼以及如何發生,但是在我們的 ITOps 對備用邏輯數據庫進行刷新之後,我的問題就解決了。

在我的 11gXE 上看起來不錯:

SQL> with test (id, name, effdt, node, parent) as
 2    (select 'SHA', 'DEPT', date '2001-01-01', 'A10200', 'TOP'    from dual union all
 3     select 'SHA', 'DEPT', date '2011-01-04', 'A10200', 'X10200' from dual union all
 4     select 'SHA', 'DEPT', date '2014-01-01', 'A10200', 'TOP'    from dual union all
 5     select 'SHA', 'DEPT', date '2014-01-04', 'A10200', 'TOP'    from dual
 6    )
 7  select id, name, effdt,
 8    lag(effdt - 1, 1, null) over (partition by node order by effdt desc) effdtend,
 9    node, parent
10  from test
11  order by node, effdt;

ID  NAME EFFDT     EFFDTEND  NODE   PARENT
--- ---- --------- --------- ------ ------
SHA DEPT 01-JAN-01 03-JAN-11 A10200 TOP
SHA DEPT 04-JAN-11 31-DEC-13 A10200 X10200
SHA DEPT 01-JAN-14 03-JAN-14 A10200 TOP
SHA DEPT 04-JAN-14           A10200 TOP

SQL> select * from v$version;

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production
PL/SQL Release 11.2.0.2.0 - Production
CORE    11.2.0.2.0      Production
TNS for 64-bit Windows: Version 11.2.0.2.0 - Production
NLSRTL Version 11.2.0.2.0 - Production

SQL>

引用自:https://dba.stackexchange.com/questions/297816