Oracle 无法筛选空的日期时间值

Oracle 无法筛选空的日期时间值,oracle,Oracle,我有一个让我发疯的问题。我必须查询返回一些日期时间值的oracle视图。 令人难以置信的问题是,即使我在WHERE子句上设置了“is NOT NULL”,即使我设置了NVL(FECHA_HASTA,FECHA_DESDE),我仍然会得到NULL值!!。这怎么可能 以下是查询: SELECT CUIL as Cuil, COD_TIPO_CAUSAL as CodTipoCausal, COD_CONVENIO as CodConvenio, FECHA_DESDE

我有一个让我发疯的问题。我必须查询返回一些日期时间值的oracle视图。 令人难以置信的问题是,即使我在WHERE子句上设置了“is NOT NULL”,即使我设置了NVL(FECHA_HASTA,FECHA_DESDE),我仍然会得到NULL值!!。这怎么可能

以下是查询:

SELECT CUIL as Cuil, 
    COD_TIPO_CAUSAL as CodTipoCausal, 
    COD_CONVENIO as CodConvenio, 
    FECHA_DESDE as FechaDesde, 
    NVL(FECHA_HASTA, FECHA_DESDE) as FechaHasta
FROM ORGANISMO.VCAUSAL_AUSENCIA
WHERE FECHA_HASTA IS NOT NULL
AND FECHA_HASTA > (SELECT SYSDATE - 180 FROM SYS.DUAL)
AND CUIL IN (SELECT CUIL FROM ORGANISMO.VEMPLEADO WHERE FECHA_EGRESO IS NULL OR FECHA_EGRESO > (SELECT SYSDATE FROM SYS.DUAL))
编辑:

下面是dump(fecha_hasta,1016)添加的内容:


转储的值表明数据已损坏。委员会:

因此,SQLDeveloper报告为null的两个值中的第四个字节(即使它们显然不是null)不应该为零,因为没有零天

根据这些规则,十六进制的
79,9d,2,0,18,3c,3c
,即十进制的
121157,2,0,24,60,60
,应转换为:

century: 121 - 100 = 21
year: 157 - 100 - 57
month: 2
day: 0
hour: 24 - 1 = 23
minute: 60 - 1 = 59
second: 60 - 1 = 59
或2157-02-0023:59:59。同样地,
78,b8,1,0,18,3c,3c
转换为2084-01-00 23:59:59

SQL Developer 18.3版与前一天一样,在脚本输出和查询结果窗口中显示这些值:

DT                  DUMPED                             
------------------- -----------------------------------
01-07-2020 23:59:59 Typ=12 Len=7: 78,78,7,1,18,3c,3c   
31-01-2157 23:59:59 Typ=12 Len=7: 79,9d,2,0,18,3c,3c   
31-12-2083 23:59:59 Typ=12 Len=7: 78,b8,1,0,18,3c,3c   
01-07-2018 00:00:00 Typ=12 Len=7: 78,76,7,1,1,1,1      
而显示零天值

因此,由于它们实际上不是空的,
不为空是合理的,
nvl()
对它们没有影响,然后如何呈现它们取决于客户端或应用程序

真正的问题是,您正在查询的视图下的表中似乎有损坏的数据,因此需要对其进行调查和修复-假设可以安全地识别无效值,并且您可以首先找到它们应该是什么,这可能是一个难题。不过,将它们作为视图的一部分或在查询中过滤掉并不简单,除非将来可以过滤掉日期。假设所有的腐败都是那么明显,并且将日期推到了未来;在某种程度上,你不得不质疑所有这些日期的有效性。。。可能会有更微妙的腐败,看起来还不错


然后,无论是什么过程或工具导致了腐败,都需要追踪和修复,这样就不会再次发生腐败。当然,很多事情都会导致损坏,但我相信,
imp
曾经有一个bug,它会损坏日期和数字,OCI程序也会。转储的值表明数据已损坏。委员会:

因此,SQLDeveloper报告为null的两个值中的第四个字节(即使它们显然不是null)不应该为零,因为没有零天

根据这些规则,十六进制的
79,9d,2,0,18,3c,3c
,即十进制的
121157,2,0,24,60,60
,应转换为:

century: 121 - 100 = 21
year: 157 - 100 - 57
month: 2
day: 0
hour: 24 - 1 = 23
minute: 60 - 1 = 59
second: 60 - 1 = 59
或2157-02-0023:59:59。同样地,
78,b8,1,0,18,3c,3c
转换为2084-01-00 23:59:59

SQL Developer 18.3版与前一天一样,在脚本输出和查询结果窗口中显示这些值:

DT                  DUMPED                             
------------------- -----------------------------------
01-07-2020 23:59:59 Typ=12 Len=7: 78,78,7,1,18,3c,3c   
31-01-2157 23:59:59 Typ=12 Len=7: 79,9d,2,0,18,3c,3c   
31-12-2083 23:59:59 Typ=12 Len=7: 78,b8,1,0,18,3c,3c   
01-07-2018 00:00:00 Typ=12 Len=7: 78,76,7,1,1,1,1      
而显示零天值

因此,由于它们实际上不是空的,
不为空是合理的,
nvl()
对它们没有影响,然后如何呈现它们取决于客户端或应用程序

真正的问题是,您正在查询的视图下的表中似乎有损坏的数据,因此需要对其进行调查和修复-假设可以安全地识别无效值,并且您可以首先找到它们应该是什么,这可能是一个难题。不过,将它们作为视图的一部分或在查询中过滤掉并不简单,除非将来可以过滤掉日期。假设所有的腐败都是那么明显,并且将日期推到了未来;在某种程度上,你不得不质疑所有这些日期的有效性。。。可能会有更微妙的腐败,看起来还不错


然后,无论是什么过程或工具导致了腐败,都需要追踪和修复,这样就不会再次发生腐败。当然,很多事情都可能导致损坏,但我相信,
imp
以前有一个bug,它可能会损坏日期和数字,OCI程序也可能会损坏日期和数字。

@AlexPoole是的,它甚至在我的应用程序中失败(问题首先出现在那里)好的,那么视图中的列数据类型实际上仍然是“日期”吗,或者它是否已被转换为字符串—后续是由SQL Developer将'(null)'放在那里(从表面上看可能是这样),还是实际上在视图查询结果中?i、 e.视图中的值是否可能根本不是空值?很明显,我在这里抓救命稻草,但没有明显的理由它会这样做。如果这是一个已知的bug,那么可能值得包含完整的Oracle版本和补丁级别。顺便说一句,您不需要对子查询
dual
——您可以执行
和FECHA\u HASTA>SYSDATE-180
FECHA\u egreeso>SYSDATE
。并且(…)
子查询中的
和CUIL可以作为联接进行重新处理,但是您可能有理由使用该构造。可能值得尝试将其作为一个连接,以防以某种方式避免您遇到的任何错误,如果这是正在发生的情况……另一种可能是视图仍在返回日期,但它已损坏;我不确定它是否可以表示为空,但我有一种模糊的感觉,我已经看到它这样做了。您可以为视图中的该行添加
选择转储(fecha_hasta,1016)
的结果吗?@AlexPoole字段数据类型是DATE,因为这是我使用descripe签出的第一件事。我将在上添加dup的图像edit@AlexPoole是的,它甚至在我的应用程序中失败(问题首先出现在这里)好的,那么视图中的列数据类型是否仍然是“日期”,或者它是否已转换为字符串-以及SQL Developer是否将“(null)”放在那里的后续问题,表面上看起来很可能,或者实际上是在视图查询结果中?i、 e.是否可能从