由於查詢語句中日期的格式引起的問題

2021-08-22 01:54:19 字數 823 閱讀 8902

我這邊有乙個系統,在乙個環境下執行完全正常,但遷到另外乙個環境後,其中乙個查詢功能就莫名其妙的出現了問題,我通過檢查,發現有乙個很複雜的查詢語句,在乙個資料庫環境下查詢完全正常,在另外乙個環境下查詢就出問題了,報的錯誤是字串的格式不對。

我首先就懷疑是資料庫環境的問題,但檢查發現,兩邊的資料庫環境都是oracle817。其次我又懷疑是由於資料庫中的資料引起的問題,後來檢查發現資料沒有問題。這樣我就開始懷疑可能查詢語句寫法有問題了,但是為什麼會在乙個資料庫環境可以,在另外乙個資料庫環境又不可以呢?這樣我就開始對這個複雜的查詢語句進行一句一句的檢查,最後終於發現,語句是查詢條件中日期的比較一邊使用了日期格式,一邊使用了字串格式,下面給個簡單的例子:

select * from tab a where a.testdate > 『2005-11-27』;

上面語句中,我假定了表tab的testdate欄位是date格式,像上面這樣已經語句,在有些環境下可能不會出錯,有些環境就會出錯了,因為在oracle中,資料庫會將字段testdate的值自動先轉換成字串,然後再跟右邊的字串進行比較。只有轉成成什麼樣格式的字串,那就要根據安裝資料庫的環境裡面的日期格式設定了,如果設定顯示的日期格式位「yyyy-mm-dd」,那麼就不會有問題,而設定成其它格式那麼就出問題了。

正確的寫法應該是將右邊的字串轉換成日期格式,如下:

select * from tab a where a.testdate > to_date(『2005-11-27』,』yyyy-mm-dd』);

另外,盡量不要對左邊的字段進行格式轉換(比如說日期轉換成字串),因為這個的話,沒乙個查詢的值都比較進行格式轉換,這樣比右邊乙個常量進行一次格式轉換的效率低多了。

SQL聯合查詢及SQL語句中日期格式的轉換

1.1 sql三表聯合查詢 如下三張表 表1 tablename1 name ageamy 18表b tablename2 name idamy 123456 表c tablename3 number id001 123456 假設需要查詢number 001該使用者的年齡 則對應的sql語句如下 ...

C 中日期與時間的格式

我們從資料庫提取的datatime型別通常包括日期和時間,我們可以通過下列的方式進行繫結 databinder.eval container,dataitem 日期字段 datatime格式字串 format strings 格式 輸出 描述 0 d 5 8 2006 短日期 0 d tuesday...

linux的shell中,日期格式校驗

在shell裡對日期格式,有效性的檢查,在網上搜了一下,對有效性檢查,很多都是借助cal命令的輸出,來檢查日期是否有效,比如 這樣 cal 2 2008 grep q 29 echo ok echo error 道理就是把年月日拆分開,在cal的某年某月的輸出中去找日期,但仔細想一下,這種方法有問題...