比较oracle中的时间戳
Comparing time stamps in oracle
假设我声明了 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,则总是 if return false。
If any one variable is null, always if return false.
您正在将一个值与 NULL 进行比较。它既不是 TRUE 也不是 FALSE。是三值逻辑,即unknown.
- 没有任何东西等于 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>
只是 Lalit 答案的一个插件:
var_t1 <> var_t2 or var_t1 is null or var_t2 is null
等同于
LNNVL(var_t1 = var_t2)
只是更短。但是请注意,您只能在 SELECT
的 WHERE
子句中使用 LNNVL
,而不能在 PL/SQL IF LNNVL()
中使用(不要问这是什么原因限制 - 我不知道)。
为了完整起见,我将添加一个 "NVL" 解决方案
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;
/
假设我声明了 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,则总是 if return false。
If any one variable is null, always if return false.
您正在将一个值与 NULL 进行比较。它既不是 TRUE 也不是 FALSE。是三值逻辑,即unknown.
- 没有任何东西等于 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>
只是 Lalit 答案的一个插件:
var_t1 <> var_t2 or var_t1 is null or var_t2 is null
等同于
LNNVL(var_t1 = var_t2)
只是更短。但是请注意,您只能在 SELECT
的 WHERE
子句中使用 LNNVL
,而不能在 PL/SQL IF LNNVL()
中使用(不要问这是什么原因限制 - 我不知道)。
为了完整起见,我将添加一个 "NVL" 解决方案
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;
/