如果date1的类型为date,值为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')
谢谢
vcudknz31#
oracle中的日期有时间组件——即使在打印出值时看起来没有时间组件。将值转换为未指定格式的字符串时,时间分量将设置为零。我建议将逻辑写成:
trunc(date1) = date '9999-12-31'
或者,如果您愿意:
date1 >= date '9999-12-31'
您指的是最大日期值,因此没有具有较大值的日期。但是在同一个日期和时间上有更大的值。我不建议将日期转换为字符串,除非出于输出目的(或者出于非常特殊的原因需要)。日期/时间函数通常足以对日期/时间值进行操作。
p1tboqfb2#
在这里,您的第一个条件是真的,因为您正在使用 TO_CHAR 它将两个日期转换为同一个字符串(字符串比较)
TO_CHAR
比如说 NLS_DATE_FORAMT 是 dd.mon.rrrr 那么你的比较将会是
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包含时间部分,因此一个日期将与第二个日期相同,如果它们在秒精度之前是相同的。可以使用trunc从date1中删除时间部分:
trunc(date1) = TO_DATE('9999-12-31', 'yyyy-MM-dd')
2条答案
按热度按时间vcudknz31#
oracle中的日期有时间组件——即使在打印出值时看起来没有时间组件。将值转换为未指定格式的字符串时,时间分量将设置为零。
我建议将逻辑写成:
或者,如果您愿意:
您指的是最大日期值,因此没有具有较大值的日期。但是在同一个日期和时间上有更大的值。
我不建议将日期转换为字符串,除非出于输出目的(或者出于非常特殊的原因需要)。日期/时间函数通常足以对日期/时间值进行操作。
p1tboqfb2#
在这里,您的第一个条件是真的,因为您正在使用
TO_CHAR
它将两个日期转换为同一个字符串(字符串比较)比如说
NLS_DATE_FORAMT
是dd.mon.rrrr
那么你的比较将会是第二个条件不是真的,因为两边都不一样-date1可能有时间部分,而右侧表达式没有时间部分。
date1包含时间部分,因此一个日期将与第二个日期相同,如果它们在秒精度之前是相同的。
可以使用trunc从date1中删除时间部分: