在SQL Server 2012中查找日期间隔?
如果员工有开始日期和结束日期以及历史记录。我们怎么能说有差距呢 样本数据:在SQL Server 2012中查找日期间隔?,sql,sql-server,sql-server-2012,Sql,Sql Server,Sql Server 2012,如果员工有开始日期和结束日期以及历史记录。我们怎么能说有差距呢 样本数据: +------+-------------+-------------+ |EmpID | StartDate | EndDate | +------+-------------+-------------+ | 555 | 7/8/2015 | 15/12/2015 | | 555 | 16/12/2015 | 25/06/2016 | | 555 | 28/06/2016 | 20/
+------+-------------+-------------+
|EmpID | StartDate | EndDate |
+------+-------------+-------------+
| 555 | 7/8/2015 | 15/12/2015 |
| 555 | 16/12/2015 | 25/06/2016 |
| 555 | 28/06/2016 | 20/12/2016 | --Here 2 days gaps.
| 555 | 21/12/2016 | 31/12/9999 |
+------+-------------+-------------+
假设没有重叠的日期,您可以使用
lag
获取上一个结束日期,并获取与当前行开始日期的差异,并检查差异是否大于1(根据所示的示例数据,这意味着差距)
假设没有重叠的日期,您可以使用
lag
获取上一个结束日期,并获取与当前行开始日期的差异,并检查差异是否大于1(根据所示的示例数据,这意味着差距)
如果是SQL Server>=2012,则可以使用lag,如下所示
Select *, GapDays = Coalesce(DateDiff(Day,lag(EndDate) over(partition by empid order by Startdate), StartDate)-1, 0)
from #emp
输出如下:
+-------+------------+------------+---------+
| EmpId | StartDate | EndDate | GapDays |
+-------+------------+------------+---------+
| 555 | 2015-08-07 | 2015-12-15 | 0 |
| 555 | 2015-12-16 | 2016-06-25 | 0 |
| 555 | 2016-06-28 | 2016-12-20 | 2 |
| 555 | 2016-12-21 | 9999-12-31 | 0 |
+-------+------------+------------+---------+
如果是SQL Server>=2012,则可以使用lag,如下所示
Select *, GapDays = Coalesce(DateDiff(Day,lag(EndDate) over(partition by empid order by Startdate), StartDate)-1, 0)
from #emp
输出如下:
+-------+------------+------------+---------+
| EmpId | StartDate | EndDate | GapDays |
+-------+------------+------------+---------+
| 555 | 2015-08-07 | 2015-12-15 | 0 |
| 555 | 2015-12-16 | 2016-06-25 | 0 |
| 555 | 2016-06-28 | 2016-12-20 | 2 |
| 555 | 2016-12-21 | 9999-12-31 | 0 |
+-------+------------+------------+---------+
我的做法如下:
create table #emp(EmpID int,StartDate date,EndDate date)
insert into #emp values
(555,'7/8/2015', '15/12/2015'),
(555,'16/12/2015','25/06/2016'),
(555,'28/06/2016','20/12/2016'), --Here 2 days gaps.
(555,'21/12/2016','31/12/9999')
查询:
select iq.EmpID,iq.StartDate,iq.EndDate, (DATEDIFF(day,iq.prev_date,iq.startdate)-1) as 'gap'
from
(select *, lag(enddate) over (partition by EmpID order by empid, startdate) as prev_date
from #emp
)iq
where (DATEDIFF(day,iq.prev_date,iq.startdate)-1) > 0
输出:
EmpID StartDate EndDate gap
----------- ---------- ---------- -----
555 2016-06-28 2016-12-20 2
我的做法如下:
create table #emp(EmpID int,StartDate date,EndDate date)
insert into #emp values
(555,'7/8/2015', '15/12/2015'),
(555,'16/12/2015','25/06/2016'),
(555,'28/06/2016','20/12/2016'), --Here 2 days gaps.
(555,'21/12/2016','31/12/9999')
查询:
select iq.EmpID,iq.StartDate,iq.EndDate, (DATEDIFF(day,iq.prev_date,iq.startdate)-1) as 'gap'
from
(select *, lag(enddate) over (partition by EmpID order by empid, startdate) as prev_date
from #emp
)iq
where (DATEDIFF(day,iq.prev_date,iq.startdate)-1) > 0
输出:
EmpID StartDate EndDate gap
----------- ---------- ---------- -----
555 2016-06-28 2016-12-20 2