Oracle中to_date要注意的問題
阿新 • • 發佈:2018-11-29
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')<=
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