2017-05-09 66 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