Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在SQL Server 2012中查找日期间隔?_Sql_Sql Server_Sql Server 2012 - Fatal编程技术网

在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