查找日期范围SQL Oracle之间的差距

时间:2016-09-07 04:09:07

标签: sql oracle

我希望通过SQL查询获取日期范围之间的差距让我们看看情况:

我有表员工喜欢:员工每个月应该得到付款

 ID  Name     From_date    To_date    Paid_Amount`

  1    ali     01/01/2002  31/01/2002    300
  2    ali     01/02/2002  28/02/2002    300
  3    ali     01/04/2002  30/04/2002    300
  4    ali     01/05/2002  31/05/2002    300
  5    ali     01/07/2002  31/07/2002    300

现在,我们注意到3月和6月没有付款 那么,如何通过SQL查询我无法得到这些月?

2 个答案:

答案 0 :(得分:0)

试试这个,

with mine(ID,Name,From_date,To_date,Paid_Amount) as
(
 select  1,'ali','01/01/2002','31/01/2002',300 from dual union all
 select  2,'ali','01/02/2002','28/02/2002',300 from dual union all
 select  3,'ali','01/04/2002','30/04/2002',300 from dual union all
 select  4,'ali','01/05/2002','31/05/2002',300 from dual union all
 select  5,'ali','01/07/2002','31/07/2002',300 from dual
 ),
 gtfirst (fromdt,todt) as (
       select min(to_Date(from_Date,'dd/mm/yyyy')) fromdt,max(to_Date(to_Date,'dd/mm/yyyy')) todt from mine
 ),
 dualtbl(first,last,fromdt,todt) as
 (
     select * from(select TRUNC(ADD_MONTHS(fromdt, rownum-1), 'MM') AS first,TRUNC(LAST_DAY(ADD_MONTHS(fromdt, rownum-1))) AS last,fromdt,todt from gtfirst connect by level <=12)
     where first between fromdt and todt and last between fromdt and todt
 )
select to_char(first,'month') no_payment_date from dualtbl where first not in (select to_Date(from_Date,'dd/mm/yyyy') from mine)
and first not in (select to_Date(to_date,'dd/mm/yyyy') from mine)

答案 1 :(得分:-1)

如果您想获得一个付款日期与上一个付款日期之间的日期差异,ID字段是顺序的,那么您可以简单地加入表格并选择上一行。< / p>

SELECT X.From_date, Y.From_date, Y.From_date - X.From_date Difference
FROM Employees X
LEFT OUTER JOIN Employees Y ON Y.ID = X.ID - 1

如果ID字段不是连续的,那么您可以使用类似的方法,但可以构建一个临时表,其中包含可用于连接回上一次付款的行索引。