比较oracle中的时间戳

时间:2015-04-09 09:46:17

标签: sql oracle plsql

假设我声明了2个时间戳变量。 让我们说

DECLARE 

var_t1 timestamp :=null;
var_t1 timestamp :=null;
BEGIN 
---Suppose if i assign a timestamp to var_t1 . 

select some_date into var_t1 from sometable where id='some_id';

--IF(var_t2<>var_t2) , this will be always false .

IF(var_t1 <> var_t2 ) THEN
  dbms_output.put_line('Inside if');

END IF;

END;

如果任何一个变量为null,则总是返回false。

3 个答案:

答案 0 :(得分:1)

  

如果任何一个变量为null,则总是返回false。

您正在将值与 NULL 进行比较。既不是 TRUE 也不是 FALSE 。它是一个三值逻辑,未知

  • 没有等于null
  • 没有什么不等于null

更有意义的代码是:

IF a <> b or (a is null and b is not null) or (a is not null and b is null)
THEN

更新添加示例。

SQL> set serveroutput on
SQL> DECLARE
  2    A NUMBER;
  3    b NUMBER;
  4  BEGIN
  5    A    :=NULL;
  6    B    :=10;
  7    IF a <> b OR (a IS NULL AND b IS NOT NULL) OR (a IS NOT NULL AND b IS NULL) THEN
  8      dbms_output.put_line('False');
  9    END IF;
 10  END;
 11  /
False

PL/SQL procedure successfully completed.

SQL>

答案 1 :(得分:1)

只是Lalit回答的补充:

var_t1 <> var_t2 or var_t1 is null or var_t2 is null

相当于

LNNVL(var_t1 = var_t2)

更短。但请注意,您只能在LNNVL的{​​{1}}子句中使用WHERE,而不能在PL / SQL SELECT中使用IF LNNVL()(不要问这是什么原因)限制 - 我不知道。)

答案 2 :(得分:1)

完整性&#39;我会添加一个&#34; NVL&#34;溶液

declare 
    yearone timestamp :=to_date('1','yyyy');
    var_t1 timestamp :=null;
    var_t2 timestamp :=sysdate;
begin 
    if nvl(var_t1, yearone) <> nvl(var_t2, yearone) then
        dbms_output.put_line('Inside if');
    end if;
end;
/