0

我需要比较两列,两者都以 sysdate 作为值,但这

select count(*) from (
      (select col from tab1) 
       minus
      (select col from tab2 ) ) -- 

给出 1 ,但我希望它是 0

让我进一步澄清:

create table tab1 (col date)
-- Can the datatype of `col` be something else 
-- rather than `date` so that when `SYSDATE` 
-- gets inserted to it, I get only `10-MAY-17` 
-- rather than the date along with time? 
-- I have control on this create statement, 
-- I can create the table as I wish to.

insert into tab1 values (sysdate) 
-- I have no control on this,
-- this is system generated .

create table tab2 (col date)  
-- I have control on it. 
-- I can modify it.

insert into tab2(col) values (sysdate) 
-- I have control on it to change it  

如果问题仍然不清楚,请告诉我。谢谢

4

2 回答 2

-1

为了从您编写的查询中获得 0,您可以使用以下命令:

create table tab1 (col date);
create table tab2 (col date);

insert all
  into tab1(col) values (sysdate)
  into tab1(col) values (sysdate)
SELECT * FROM dual;

  commit;

此外,该minus运算符将为您提供存在于 tab1 而不是 tab2 的行。您可能还需要反过来知道结果。在这种情况下使用:

select count(*) (
select .. from tab1 minus select .. from tab2
union all
select .. from tab2 minus select .. from tab1)

这将向您显示两个表中的不匹配,而不仅仅是第一个。

于 2017-05-15T06:21:02.730 回答
-1

问题sysdate是,它返回当前日期和时间。当我们将一个日期列与另一列进行比较时,我们是在比较日期和时间元素。如果日期具有不同的时间元素,则列将不匹配。

我怀疑这就是为什么你得到你不想要的结果。幸运的是,解决方案非常简单:用于trunc()从日期中删除时间元素。

SQL> select * from tab1;

COL 
-------------------
2017-05-09 03:25:45
2017-05-09 06:30:32
2017-05-09 12:20:47

SQL> select * from tab2;

COL 
-------------------
2017-05-09 14:12:10
2017-05-09 15:25:59

SQL> select count(*) from (
  2        (select trunc(col) from tab1) 
  3         minus
  4        (select trunc(col) from tab2)) 
  5  /

  COUNT(*)
----------
         0

SQL> 

基于后续修订的替代解决方案:

create table tab1 (col date)
-- 数据类型col可以是别的东西
-- 而不是dateSYSDATE
-- 被插入到它时,我只得到10-MAY-17
-- 而不是日期和时间?
-- 我可以控制这个创建语句,
-- 我可以根据需要创建表

建立一个触发器tab1

create or replace trg_tab1
before insert or update on tab1
begin
    :new.col := trunc(:new.col);
end;

这将从中删除时间元素col

insert into tab2(col) values (sysdate)
-- 我可以控制它来改变它

插入时只需应用截断

insert into tab2(col) values (trunc(sysdate))

tab2或者像上面那样构建一个触发器。

现在您在两个表中都有纯日期的记录,因此您的原始减号查询无需修改即可工作。


注意猜测的性质

我对这个问题的假设是,这是某种形式的流程检查:tab1代表一些初始状态,某些事情发生并tab2在流程完成时填充。如果是这样,也许 OP 的查询是为了检查没有未处理的记录。

显然,我们可以想出更好(更稳健、更准确)的方式来实施这样的流程,但问题并没有要求我们这样做。是的,我同意 Seeker 应该解释他们试图实现的业务逻辑,而不是期望我们对其进行逆向工程。

于 2017-05-09T20:19:13.547 回答