2017-05-09 46 views
0

我需要比较两列,两者都具有SYSDATE的值,但这个如何平衡两个表的两列,均具有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 

请让我知道,如果问题仍不清楚。 谢谢

+0

您使用的是什么SQL后端?并非每个SQL实现都支持MINUS运算符。甲骨文我知道,但SQL Server,PostgreSQL和SQLite使用EXCEPT运算符。 – ShaneNal

+0

你不清楚。数据类型与什么有什么关系?希望这两列有DATE数据类型,不应该改变。这里有什么问题? SYSDATE被插入到tab1中,并且应该在tab2中插入相同的值,但是它不同,因为SYSDATE稍后被称为秒的小数部分?不要将SYSDATE插入到tab2中,请从tab1插入值。 – mathguy

+0

@ShaneNal - 您是否有特别的理由相信OP对帖子进行了错误标记?我看到Oracle和PLSQL,以及我认为特定于Oracle的名称SYSDATE。为什么怀疑? – mathguy

回答

-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的数据类型可以是别的东西
- 而不是date这样当SYSDATE
- - 插入它,我只得到10-MAY-17
- 而不是随着时间的日期?
- 我对这个create语句控制,
- 我可以创建表,因为我想

建设上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的查询是为了检查没有未处理的记录。

显然我们可以想到更好(更强大,更准确)的方式来实现这样一个过程,但问题并没有要求我们这样做。是的,我同意寻求者应该解释他们试图执行的业务逻辑,而不是期待我们对其进行逆向工程。

+0

如果今天,不同时间三次将第一个表中的sysdate插入到第二个表中,这将找到答案“0”。这个要求真的不清楚,但我怀疑这种行为不是需要的。 – mathguy

+0

@mathguy - 不确定你想要做什么 – APC

+1

我试图做的要点是猜测需求并提供解决方案,当需求不明确时,通常不是很有帮助。在这个特定的情况下,我认为这是一个非常大的跳跃,假设这个需求是通过'trunc(sysdate)'匹配的。无论如何,在我看来,向OP提出的问题 - 这是否是要求属于评论。你认为这可能是事实上的要求吗? – mathguy

-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行。您可能还需要以其他方式了解结果。我n该情况下使用:

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

这将显示错配在这两个表中,不仅是第一个。

+0

关于OP的第一个插入说:“我无法控制这个,这是系统生成的”。我认为这两张表是某种形式的检查,所以INSERT ALL解决方案可能无济于事。但由于OP自上周以来一直没有回到这个问题,我怀疑我们会得到进一步的澄清。 – APC

+0

@APC - 你也许是正确的,但在所有情况下,我认为插入所有将满足要求..不知道这-1表决来自哪里,但它只是似乎不公平,你也有同样的:( - 这是负面的投票,至少在我写这篇文章的时候 – g00dy