1. 程式人生 > >Oracle中to_date要注意的問題

Oracle中to_date要注意的問題

1、在眾多的查詢之中,我們經常會遇到一個時間查詢的例子,而在資料庫中大部分是DATE型別直接來定義時間的,DATE型別預設的格式(yyyy-mm-dd hh24:mi:ss)。
那麼,在查詢中一般常見的寫法有兩種:
    此處假設sendate為查詢欄位,型別:DATE 
    往往的條件會寫成 sendate<=to_date('2018-03-14','yyyy-mm-dd') (方法1)
                或者 to_char(sendate,'yyyy-mm-dd')<=

'2018-03-14' (方法2)

2、首先不看結果,方法2上會造成索引失效,這樣影響執行的效率。注:to_date的查詢效率比to_char要高

3、看結果,很多人會說結果是一樣的,其實不然,to_date('2018-03-14','yyyy-mm-dd') 因為與date型別的資料進行 比較,在查詢時,ORACLE會自動追加一個 00:00:00  構成yyyy-mm-dd hh24:mi:ss型別。這樣其實我們的查詢結果是不會 包含3月14日的資料的。

4、解決辦法,針對以上的分析,方法1應該寫成 sendate<=to_date('2018-03-14 23:59:59','yyyy-mm-dd hh24:mi:ss')
或者 sendate<to_date('2018-03-15','yyyy-mm-dd')

 

5.綜上所訴    sendate>to_date('2018-03-14','yyyy-mm-dd');    =>     欄位>2018-03-14 00:00:00  

                     如果是大於的其實可以寫yyyy-mm-dd(年月日)  當然是根據需求規範定的


                      sendate<o_date('2018-03-14','yyyy-mm-dd');    =>     欄位<2018-03-14 00:00:00   (查詢不到當天14號的資料)

                      如果是小於的要寫yyyy-mm-dd hh24:mi:ss(年月日時分秒)    或者這是在查詢時間範圍基礎上+1天 

                     好比:2018-03-15 00:00:00