Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/37.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 现在应该涵盖重叠和重复时间的定义。为了证明这一点,我在SQL中加入了更多的记录。如何为MySQL 5.6或5.7重写它? ID StaffID Date BeginTime EndTime 1 101 2014-01_Sql Server_Sql Server 2008_Group By - Fatal编程技术网

Sql server 现在应该涵盖重叠和重复时间的定义。为了证明这一点,我在SQL中加入了更多的记录。如何为MySQL 5.6或5.7重写它? ID StaffID Date BeginTime EndTime 1 101 2014-01

Sql server 现在应该涵盖重叠和重复时间的定义。为了证明这一点,我在SQL中加入了更多的记录。如何为MySQL 5.6或5.7重写它? ID StaffID Date BeginTime EndTime 1 101 2014-01,sql-server,sql-server-2008,group-by,Sql Server,Sql Server 2008,Group By,现在应该涵盖重叠和重复时间的定义。为了证明这一点,我在SQL中加入了更多的记录。如何为MySQL 5.6或5.7重写它? ID StaffID Date BeginTime EndTime 1 101 2014-01-01 08:00 09:00 2 101 2014-01-01 08:30 09:30 3 101 2014-01-01 18:00 20:30 4 101


现在应该涵盖重叠和重复时间的定义。为了证明这一点,我在SQL中加入了更多的记录。如何为MySQL 5.6或5.7重写它?
ID    StaffID  Date        BeginTime EndTime
1     101      2014-01-01  08:00     09:00
2     101      2014-01-01  08:30     09:30
3     101      2014-01-01  18:00     20:30
4     101      2014-01-01  19:00     21:00
StaffID Date        BeginTime EndTime
101     2014-01-01  08:00     09:30
101     2014-01-01  18:00     21:00
;with flat as
(
 select StaffID, ServiceDate, BeginTime, EndTime, BeginTime as groupid 
 from services S1
 where not exists (select * from services S2 
 where S1.StaffID = S2.StaffID 
 and S1.ServiceDate = S2.ServiceDate 
 and S2.BeginTime <= S1.BeginTime and S2.EndTime <> S1.EndTime
 and S2.EndTime > S1.BeginTime)

  union all

  select StaffID, ServiceDate, BeginTime, EndTime, BeginTime as groupid 
  from services S1
 where exists (select * from services S2 
 where S1.StaffID = S2.StaffID 
 and S1.ServiceDate = S2.ServiceDate 
 and S2.BeginTime = S1.BeginTime and S2.EndTime > S1.EndTime)
   and not exists (select * from services S2 
 where S1.StaffID = S2.StaffID 
 and S1.ServiceDate = S2.ServiceDate 
 and S2.BeginTime < S1.BeginTime
 and S2.EndTime > S1.BeginTime)

 union all

 select S.StaffID, S.ServiceDate, S.BeginTime, S.EndTime, flat.groupid 
 from flat
 inner join services S 
 on flat.StaffID = S.StaffID
 and flat.ServiceDate = S.ServiceDate
 and flat.EndTime > S.BeginTime
 and flat.BeginTime < S.BeginTime and flat.EndTime < S.EndTime
)

select StaffID, ServiceDate, MIN(BeginTime) as begintime, MAX(EndTime) as endtime 
from flat
group by StaffID, ServiceDate, groupid
order by StaffID, ServiceDate, begintime, endtime
select  i = row_number() over (order by (select null)) 
into    #numbers
from    @services; -- where i put your data
select      s.StaffID, 
            s.Date,
            linesWKT = geometry::UnionAggregate(line).ToString() 

            -- If you have SQLSpatialTools installed then:
            -- linesWKT = dbo.GeometryUnionAggregate(line).ToString() 

into        #aggregateRangesToGeo
from        @services s
cross apply (select 
                beginTimeF = convert(float, convert(datetime,beginTime)),
                endTimeF = convert(float, convert(datetime,endTime))
            ) prepare
cross apply (select
                beginPt = geometry::Point(beginTimeF, 0, 0),
                endPt = geometry::Point(endTimeF, 0, 0)
            ) pointify
cross apply (select 
                line = beginPt.STUnion(endPt).STEnvelope()
            ) lineify
group by    s.StaffID,
            s.Date;
select      lns.linesWKT,
            beginTime = convert(time, convert(datetime, ap.beginTime)),
            endTime = convert(time, convert(datetime, ap.endTime))
into        #parsedLines
from        (select distinct linesWKT from #aggregateRangesToGeo) lns
cross apply (select 
                lines = geometry::STGeomFromText(linesWKT, 0)
            ) geo
join        #numbers n on n.i between 1 and geo.lines.STNumGeometries()
cross apply (select 
                line = geo.lines.STGeometryN(n.i).STEnvelope()
            ) ln
cross apply (select 
                beginTime = ln.line.STPointN(1).STX,
                endTime = ln.line.STPointN(3).STX
            ) ap;
select      ar.StaffID,
            ar.Date,
            pl.beginTime, 
            pl.endTime
from        #aggregateRangesToGeo ar
join        #parsedLines pl on ar.linesWKT = pl.linesWKT
order by    ar.StaffID, 
            ar.Date,
            pl.beginTime;