我希望提取报表运行当月已过帐的所有发票。它必须很简单,这是我所忽略的。我在ORACLE数据库上。
我在想:
Select * from Invoice inv
WHERE inv.post_date between to_date ('FIRST_OF_THE_MONTH', 'MM/DD/YYYY')
and to_date ('LAST_OF_THE_MONTH', 'MM/DD/YYYY')
当然,FIRST_OF_THE_MONTH
和LAST_OF_THE_MONTH
不是真实的事物。对吧?
答案 0 :(得分:2)
在数据库(尤其是Oracle)中使用date
时必须非常小心。 Oracle将时间成分作为date
数据类型的一部分。因此,您应避免使用between
。
相反,将逻辑写为:
select i.*
from Invoice i
where i.post_date >= trunc(sysdate, 'MON') and
i.post_date < add_months(trunc(sysdate, 'MON'), 1);
无论post_date
是否具有时间分量,此逻辑均有效,因此更安全。
答案 1 :(得分:0)
如果需要当前月份的最后一个,可以使用TRUNC
和SYSDATE
来获取月份的开始时间。您可以这样做:
Select * from Invoice inv
WHERE inv.post_date between TRUNC( SYSDATE, 'MONTH' )
and ADD_MONTHS( TRUNC( SYSDATE, 'MONTH' ) + 1 )