2016-02-24 127 views
1

我在做oracle中的日期比較。 當我執行下面與Oracle中的日期比較問題

select tr.x, tbi.y, to_char(tr.UPDATED_AT,'dd-mon-yyyy') 
from tbi, tb, tr 
where 
tbi.id=tb.id and 
tb.id=tr.id and 
tr.updated_at = to_date('23/02/2016', 'dd/MM/yyyy') 

代碼沒有行選擇

但是,當我執行以下查詢

select tr.x, tbi.y, to_char(tr.UPDATED_AT,'dd-mon-yyyy') 
from tbi, tb, tr 
where 
tbi.id=tb.id and 
tb.id=tr.id 
and 
tr.updated_at > to_date('23/02/2016', 'dd/MM/yyyy') 

我得到這樣的結果

trx.x tbi.y TO_CHAR(TR.UPDATED_AT,'DD-MM-YYYY') 
123456 0 23-02-2016 
12345 0 23-02-2016 
123  0 23-02-2016 
123123 0 23-02-2016 

爲什麼>運營商顯示日期相等,並且=沒有顯示相同的日期?

回答

1

您應該使用TRUNC()

select tr.x, tbi.y, to_char(tr.UPDATED_AT,'dd-mon-yyyy') 
from tbi, tb, tr 
where 
tbi.id=tb.id and 
tb.id=tr.id 
and 
trunc(tr.updated_at) = to_date('23/02/2016', 'dd/MM/yyyy') 

與您查詢的問題(我被它的外觀是猜測)你的updated_at格式爲DD/MM/YYYY HH24:MI:SS。

因此,23/02/2016不等於23/02/2016 20:00:05。 (A默認HH24:MI:一個日期的ss是00:00:00)

TRUNC()使格式化像日/月/年的時間,並忽略小時

+0

謝謝。這是工作,但爲什麼沒有trunc不工作? – monvic

+0

我已經解釋了所有@monvic – sagi

+0

明白了。謝謝@sagi – monvic

0

問題

tr.updated_at = to_date('23/02/2016', 'dd/MM/yyyy') 

回報你只有結果,其中updated_at等於23/02/2016 00:00:00

解決方案

嘗試,而不是執行以下操作:

trunc(tr.updated_at) = to_date('23/02/2016', 'dd/MM/yyyy') 

CF trunc function documentation

0
Because updated_at column have the date with minutes and seconds. 
You are trying to fetch records for which updated_at has the value 
23/02/2016 00:00:00 

嘗試此所需的輸出:

選擇tr.x,tbi.y,TO_CHAR(tr.UPDATED_AT, 'DD-MON-YYYY') 從TBI,TB,TR 其中 tbi.id = tb.id和 tb.id = tr.id和 to_char(tr.updated_at,'dd/mm/yyyy')= to_date('23/02/2016','dd/MM/yyyy' )

0

使用TRUNC,正如其他答案所建議的,它使得不可能在此字段上使用索引(基於函數的索引除外)。出於這個原因,你可能更喜歡

tr.updated_at between to_date('23/02/2016', 'dd/mm/yyyy') 
        and to_date('23/02/2016 23:59:59', 'dd/mm/yyyy hh24:mi:ss') 
+0

這個領域沒有索引,但很有可能知道未來。謝謝 – monvic