2017-06-22 81 views
1

我這樣做查詢:查詢問題與where子句

select xx.number, 
     xx.timestamp 
    from table xx 
where number = 6 
    and timestamp = to_timestamp('09/09/99', 'DD/MM/RR'); 

其中number = NUM​​BER(3,0)和時間戳= TIMESTAMP(可以因爲它不是一個PK,也不是一個FK重複)(6 )(也可以重複)。

有這樣

9 - 09/09/99 00:00:00,000000000 
1 - 07/03/17 10:23:05,337000000 
2 - 28/02/17 18:18:18,666000000 
4 - 16/02/17 13:53:17,058000000 
6 - 09/09/99 00:00:00,000000000 
6 - 09/09/99 00:00:00,000000000 
1 - 24/02/17 09:36:07,382000000 
8 - 09/09/99 00:00:00,000000000 

問題是記錄,當我做

select xx.number, 
     xx.timestamp 
    from table xx 
where timestamp = to_timestamp('09/09/99', 'DD/MM/RR'); 

它只返回1八1九(不好),它應該有2個亂七八糟太

當我做

select xx.number, 
     xx.timestamp 
    from table xx 
where number = 6; 

它返回2六和它的日期時間(好)

但是當我做這兩個條件查詢它從不返回任何東西。我猜是因爲第一個查詢返回錯誤的輸出。

有什麼想法?

+0

試圖改變和一個OR? – MrKobayashi

+0

我需要它同時具備兩個條件。如果我更改爲或,它確實會返回所有內容,但我只需要那些與六個和時間戳= 09/09/99 00:00:00,000000000 – user2690047

+0

可能是https://stackoverflow.com/q/41568532/1509264 – MT0

回答

2

[TL/DR ]請勿使用RR格式模型使用YYYY,並在插入和過濾數據時傳遞4位數的年份。

問題可能出在您用來顯示和解析日期的RR格式。

如果你這樣做:

select xx.number, 
     TO_CHAR(xx.timestamp, 'YYYY-MM-DD HH24:MI:SS.FF9) 
from table xx 
here number IN (6, 8, 9); 

我有一個強烈的懷疑你會得到輸出:

9 1999-09-09 00:00:00.000000000 
6 2099-09-09 00:00:00.000000000 
6 2099-09-09 00:00:00.000000000 
8 1999-09-09 00:00:00.000000000 

凡與數6行的世紀並不19但無論哪種0020

所以你的時間戳不匹配的原因是他們沒有相同的世紀。您需要確定表格中的數據是否存在錯誤,並且應該是年份爲9919992099並解決該問題 - 那麼您的查詢應該可以正常工作。

但是,您還應該調查爲什麼這種情況發生在第一位。正常情況下使用INSERT語句之一:

是格式傳遞的輸入
  • TO_TIMESTAMP(your_date, 'DD/MM/YYYY')09/09/99所以數據庫假定今年是0099;或
  • TO_TIMESTAMP(your_date, 'DD/MM/YY')是格式09/09/99傳遞的輸入,所以數據庫假定一年2099(在本世紀),當你期待1999,應使用格式模式DD/MM/RR

更好的解決方法是始終使用4位數的年份。

+0

做一個 其中number ='6'和( timestamp> = to_timestamp('09/09/99 00:00:00,000000000','DD/MM/%% RR HH24:MI:SSXFF') 和時間戳<= to_timestamp(' 09/09/9999 00:00:00,000000000','DD/MM/%% RR HH24:MI:SSXFF')) 它最終表明SIXES是XX/XX/8099 ... – user2690047

+0

@ user2690047你走了,日期不匹配,因爲幾個世紀不匹配。 '8099'是一個奇怪的年份,並且絕對有理由調查這個世紀從哪裏來,以及它作爲一種價值是否有意義(取決於您的應用程序,這可能是有道理的)。 – MT0

0

嘗試使用「DD/MM/YY」,以及和檢查,如果同樣的結果來了,因爲「99」可以表明1899年以及在數據庫中(儘管可能性不大)

+0

將它改爲:to_timestamp('09/09/99','DD/MM/YY'),它只返回數字= 1的那個...我沒有得到這個... – user2690047

-1

試試這個,如果你用「組由」與日期,將工作,但如果你有時間的使用,我會爲你帶來多行

select xx.number, 
      cast(xx.timestamp as date) as timestamp 
     from table xx 
    where number = 6; 
    group by number,cast(xx.timestamp as date)