mysql时间段交集的问题

m0_37535683 2017-06-13 03:49:59

下图是我要的效果,上图是数据的记录,sql语句该怎样实现
...全文
444 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
m0_37535683 2017-06-15
  • 打赏
  • 举报
回复
mysql数据库的
m0_37535683 2017-06-14
  • 打赏
  • 举报
回复
时间24小时,有区别日期的
zhouyuehai1978 2017-06-14
  • 打赏
  • 举报
回复
忘记放图了
zhouyuehai1978 2017-06-14
  • 打赏
  • 举报
回复
--测试数据
if not object_id(N'Tempdb..#T') is null
    drop table #T
Go
Create table #T(id INT ,userid INT, start_time TIME,end_time TIME)
Insert #T
SELECT 1,1,'8:00','9:00' UNION ALL
SELECT 2,1,'8:30','10:10' UNION ALL
SELECT 3,1,'10:00','11:00' UNION ALL
SELECT 4,1,'12:00','14:00' UNION ALL
SELECT 5,1,'13:00','15:00' UNION ALL
SELECT 6,1,'8:30','8:45' UNION ALL
SELECT 7,1,'10:00','10:30' UNION ALL
SELECT 8,2,'8:30','10:30' UNION ALL
SELECT 9,2,'8:00','11:00' UNION ALL
SELECT 10,2,'9:00','11:30' 
Go
--测试数据结束
--SELECT * FROM #T AS t
;WITH a AS(
SELECT *,
       ROW_NUMBER() OVER(PARTITION BY t.userid ORDER BY t.start_time) AS nt
FROM   #T AS t)
,b as (                                                   
SELECT userid,
       start_time,
       nt,
       ROW_NUMBER() OVER(ORDER BY a.userid, a.start_time) AS nt1
FROM   a AS a
WHERE  nt = 1
       OR  a.start_time > (
               SELECT MAX(end_time)
               FROM   a AS a1
               WHERE  a.userid = a1.userid
                      AND a.nt > a1.nt
           )
)
SELECT userid,
       start_time,
       CASE 
            WHEN EXISTS (
                     SELECT 1
                     FROM   b AS b1
                     WHERE  b.userid = b1.userid
                            AND b1.nt1 = b.nt1 + 1
                 ) THEN (
                     SELECT MAX(a.end_time)
                     FROM   a AS a
                     WHERE  a.userid = b.userid
                            AND a.nt < (
                                    SELECT b1.nt
                                    FROM   b AS b1
                                    WHERE  b.userid = b1.userid
                                           AND b1.nt1 = b.nt1 + 1
                                )
                 )
            ELSE (
                     SELECT MAX(a.end_time)
                     FROM   a AS a
                     WHERE  a.userid = b.userid
                 )
       END AS end_time
FROM   b AS b
二月十六 2017-06-13
  • 打赏
  • 举报
回复
什么规则呢?8点到12点,然后12点到18点,然后第二天?

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧