[英]Oracle SQL date comparison
為什么如果 date1 是日期類型,其值為:31-DIC-99 00:00:00
這個指令是真的
to_char(date1) = to_char(TO_DATE('9999-12-31', 'yyyy-MM-dd'))
這是假的嗎?
date1 = TO_DATE('9999-12-31', 'yyyy-MM-dd')
謝謝
Oracle 中的日期具有時間分量——即使在打印出這些值時您沒有看到它們。 當您將該值轉換為未指定格式的字符串時,時間分量將設置為零。
我建議將邏輯編寫為:
trunc(date1) = date '9999-12-31'
或者,如果您願意:
date1 >= date '9999-12-31'
您指的是最大日期值,因此沒有較大值的日期。 . . 但在同一日期有更大的值與時間。
我不建議將日期轉換為字符串,除了 output 目的(或者如果出於非常特定的原因需要)。 日期/時間函數通常足以用於日期/時間值的操作。
在這里,您的第一個條件為真,因為您在雙方都使用TO_CHAR
,它將兩個日期轉換為相同的字符串。 (字符串比較)
to_char(date1) = to_char(TO_DATE('9999-12-31', 'yyyy-MM-dd'))
假設NLS_DATE_FORAMT
是dd.mon.rrrr
那么你的比較將是
to_char(date1,'dd.mon.rrrr') = to_char(TO_DATE('9999-12-31', 'yyyy-MM-dd'),'dd.mon.rrrr')
第二個條件不成立,因為雙方不同 - date1 可能有時間部分,而右側表達式沒有。
date1 = TO_DATE('9999-12-31', 'yyyy-MM-dd')
date1 包含時間部分,因此如果它們在秒精度之前相同,則一個日期將與第二個日期相同。
您可以使用 trunc 從 date1 中刪除時間部分:
trunc(date1) = TO_DATE('9999-12-31', 'yyyy-MM-dd')
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.