我正在尝试从oracle表中获取所有数据。我在WHERE子句中试过这句话。
date between to_date(sysdate-1) and to_date(sysdate);
date between (current_date-1) and (current_date);
date BETWEEN (TO_CHAR(SYSDATE-1,'DD-MON-YY')) AND (TO_CHAR(SYSDATE,'DD-MON-YY'));
为了比较结果,我用这段代码执行了查询:
date between to_date('08/04/2015 00:00:00.00', 'dd/mm/yyyy hh24:mi:ss.ff' ) and
to_date('09/04/2015 00:00:00.00', 'dd/mm/yyyy hh24:mi:ss.ff' )
我完全相信这个查询给了我正在寻找的正确的数据集,但是这个结果与我前两个例子的结果完全不同,甚至四个结果都不同他们之间。
这个查询是在午夜后自动执行的,我可以手动更新日期,所以我的问题是,当我直接指定我需要前一天的所有寄存器时,如何获得与我相同的结果(从00:00 am到12:00 pm)。
此致
答案 0 :(得分:5)
对已经是TO_DATE()
数据类型的内容执行DATE
是一个很大的禁忌。您依赖于从DATE
到字符串的隐式转换,然后返回到DATE
,这可能会导致意外结果。更好地使用明确做你想要它做的事情,例如。 TRUNC()
。
此外,BETWEEN
也是包容性的 - 如果你今天在午夜发生的所有事情包括,那么你可以使用BETWEEN
如果您想要昨天发生的所有事情排除午夜,那么您最好做以下事情:
...
and date_col >= trunc(sysdate -1)
and date_col < trunc(sysdate)
...
请勿忘记DATE
包含时间价值,因此如果您想要在一天内完成所有事情,则必须记住将日期截至午夜(例如{{1} })