Oracle中的日期表达式

时间:2015-02-19 12:01:31

标签: oracle

如何在Oracle中评估以下表达式?

WHERE nvl(MODIFIEDDATE, TO_DATE('2030/01/01', 'YYYY/MM/DD HH24:MI:SS'))
  > TO_DATE('', 'YYYY/MM/DD HH24:MI:SS')

任何人都可以解释这会做什么吗?我不是甲骨文的人。

3 个答案:

答案 0 :(得分:2)

您正在将日期与NULL进行比较。

此:

  

nvl(MODIFIEDDATE,TO_DATE(' 2030/01/01',' YYYY / MM / DD HH24:MI:SS'))

意味着,只要MODIFIEDDATE为NULL,就使用日期值。

SQL> alter session set nls_date_format='YYYY/MM/DD HH24:MI:SS';

Session altered.

SQL> SELECT TO_DATE('2030/01/01', 'YYYY/MM/DD HH24:MI:SS') LHS, TO_DATE('', 'YYYY/MM/DD HH24:MI:SS') RHS FROM dual;

LHS                 RHS
------------------- -------------------
2030/01/01 00:00:00

SQL>

因此,基本上,将任何与NULL进行比较的结果都是......"未知"。因此,您的查询将不返回任何内容。

答案 1 :(得分:1)

条件的前半部分:

nvl(MODIFIEDDATE, TO_DATE('2030/01/01', 'YYYY/MM/DD HH24:MI:SS'))

...表示如果MODIFIEDDATE列为空,则会使用2030-01-01的魔术日期。

条件的后半部分:

TO_DATE('', 'YYYY/MM/DD HH24:MI:SS')

...将始终评估为null。除了使用is [not] null运算符之外,Null无法与包括其自身在内的任何其他值进行比较。

此条件的结果将始终为“未知”,因此不会返回任何行。

它将排除所有行,而不仅仅是那些具有空日期的行; nvl()意味着无论如何都会给任何空值赋值。如果您只想排除具有空日期的日期,则可以指定WHERE MODIFIEDDATE IS NOT NULL,但不清楚该代码的用途是什么。

答案 2 :(得分:1)

让我们详细介绍一下:

NVL(MODIFIEDDATE, TO_DATE('2030/01/01', 'YYYY/MM/DD HH24:MI:SS'))

如果它不是NULL,则返回MODIFIEDDATE。如果MODIFIEDDATE为NULL,则它将返回DATE2030/01/01 00:00:00(时间组件将默认为午夜,因为它未在'2030/01/01'的时间字面中指定) 。所以这将始终返回非NULL DATE值。

TO_DATE('', 'YYYY/MM/DD HH24:MI:SS')

这将始终返回NULL。 Oracle中的零长度字符串表示NULL。这是设计的(可以追溯到Oracle的最早期),并且是IMO在Oracle产品中的最差设计决策之一。但它就是这样 - Oracle中的零长度字符串是NULL,永远是永远的。并且NULL是有毒的,因此TO_DATE(NULL, 'YYYY/MM/DD HH24:MI:SS')将返回NULL。

所以现在我们已经

SOME_VALID_DATE_VALUE > NULL

这将始终返回NULL,因为与NULL的任何比较都返回NULL(记住 - NULL是有毒的)。所以WHERE子句变为

WHERE NULL...

因此使用此WHERE子句的查询将不返回任何行。

分享并享受。