謂詞看起來比它們需要的更加複雜。
爲什麼不會返回您要返回的結果?
WHERE CREATEDATE >= TRUNC(SYSDATE-1)
AND CREATEDATE < TRUNC(SYSDATE)
說明一下,在「簡單的英語」,這三個由SELECT語句返回的表達式:
SELECT SYSDATE
, TRUNC(SYSDATE)
, TRUNC(SYSDATE-1)
FROM DUAL
返回日期值(值是甲骨文的數據類型爲DATE)。
------------------- ------------------- -------------------
2016-04-16 13:59:26 2016-04-16 00:00:00 2016-04-15 00:00:00
我們沒有看到的是CREATEDATE的數據類型。顯然,我們期望它被定義爲DATE。但是如果你已經聲明它爲VARCHAR並且以'16 -APR-2016 13:59:26'的格式存儲字符串,那麼「除非」你觀察的問題只是冰山一角,否則「似乎不起作用。
(你所觀察的行爲可以很容易地如果CREATEDATE被聲明爲VARCHAR,而不是DATE解釋。)
如果你的SQL 是工作,因爲它是寫的,它依賴於當前的設置的NLS_DATE_FORMAT。也就是說,你的SQL可以很容易地用relataively無害的聲明打破,如:
ALTER SESSION SET NLS_DATE_FORMAT='YYYY-MM-DD' ;
的一些在當前查詢表達式的組件的破舊......
(注 :使用DATE表達式執行字符串連接需要Oracle執行隱式TO_CHAR轉換。 Oracle使用NLS_DATE_FORMAT作爲默認格式模型。)
的TO_DATE
功能的第二個參數是一個格式模型。
DD
是兩位數日(如07或16)
MON
爲月
YY
三個字母的縮寫一年兩個字符表示,與隱含世紀(
HH24
是二(24小時制),00到23
MI
是兩位數分鐘,00到59
SS
是兩個d igit秒,00直通59
(注:沒有我們已經修復 Y2K問題?爲什麼我們重新創造它)
我認爲最重要的事情,瞭解有關當前SQL:它使用比需要更多的令人費解的表情。而我看到的表達式,以三種方式被打破:
取決於NLS_DATE_FORMAT的隱TO_CHAR功能明確的業態模式在to_date函數適當匹配
沒有任何藉口使用兩性格年,我們可以輕鬆使用四位數年份。特別是當不需要首先將DATE值轉換爲字符串時。
使用< =比較而不是<比較,取決於日期時間類型的最大精度爲一秒,當我們可以輕鬆地指定第二天的「小於」午夜時,使用模式處理小數秒。
如果將CREATEDATE聲明爲VARCHAR,則會以另一種方式破壞...比較正在作爲字符串比較執行。對於比較右側的表達式,存在隱式TO_CHAR轉換。這些轉換(再次)依賴於NLS_DATE_FORMAT設置。使用歷史悠久的Oracle默認設置DD-MON-YY,字符串比較將在某種意義上起作用,即語法不是無效的,但根據返回日期值在兩個其他日期值之間的比較,這些比較是中斷 。
oracle文檔將告訴您每個函數的功能。 –
如果CREATEDATE被聲明爲VARCHAR而不是DATE,那麼Mary Stigmata姐妹也應該與統治者一起挑戰自己。 – spencer7593
我笑了。幸運的是,對於這段SQL的作者,CREATEDATE確實是DATE類型的。 –