我正在使用以下查询。
select sysdate from dual where to_char(sysdate,'DD-MM-YY')='28-MAY-13';
,输出为空。但对于以下查询,输出是当前日期。
select sysdate from dual where to_date(sysdate,'DD-MM-YY')= to_date('28-MAY-13','DD-MM-YY');
为什么to_char函数无法返回sysdate?
我们不是要用to_char比较日期吗?
答案 0 :(得分:4)
关于:我们不是要用to_char比较日期吗?
不,我们不应该。我们应该使用to_char来格式化日期以用于显示目的。如果您有任何其他原因,那可能是一个坏主意。
在比较oracle中的日期时,请记住oracle日期包括时间。查看值是否在日期范围内的最佳方法是:
where myDateField >= date1
and myDateField < the day after date2
如果您的日期范围是今天,请执行以下操作:
where myDateField >= trunc(sysdate)
and myDateField < trunc(sysdate + 1 )
如果要将它与作为字符串的输入参数进行比较,请使用to_date将字符串转换为日期,然后实现相同的一般概念。
答案 1 :(得分:3)
尝试'DD-MON-YY'格式以映射到'28 -MAY-13'
'MM'映射到月份编号。
编辑:SQL可以计算出在to_date中使用正确的格式;当它看到输入字符串是'28 -MAY-13'格式时,它会自动将'DD-MM-YY'转换为'DD-MON-YY'。但是,to_char不做任何假设;所以它试图比较'28 -05-13'到'28 -MAY-13'
EDIT2:另外一个注意事项是DUAL只能返回一行;所以你可以做到
SELECT sysdate FROM DUAL
Dan Bracuk对日期比较有一些好处;尽可能保持日期格式。如果只有日子而不是时间,请使用trunc(DateTime);如果您使用'='通常是必要的,但如果您检查BETWEEN
则通常不需要