生成时间段不交叉的数据。

生成时间段不交叉的数据。

设置四个变量,主要

DROP TABLE IF EXISTS `ordertable`;
CREATE TABLE `ordertable` (
  `orderID` varchar(36) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '订单ID',
  `postedTime` varchar(20) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '执行时间',
  `startTime` varchar(20) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '开始时间',
  `endTime` varchar(20) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '完成时间',
  `Name` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '服务人员',
  `orderAmount` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '费用',) 
  ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

用变量的来存储上一条数据的信息,然后当前生成数据和变量里的数据对比。
SELECT orderID,Name,postedTime,
    (@start := CASE WHEN @n = Name AND @d = postedTime
                THEN TIMESTAMPADD(Minute, ROUND(RAND()*12)+8, @end)
                ELSE TIMESTAMPADD(Minute, ROUND(RAND()*60), concat(postedTime,' 07:30:00'))
                END) as starttimes,
    (@end := TIMESTAMPADD(Minute, ROUND(RAND()*30)+30, @start)) as endtimes,
    @n := esName,
    @d := postedTime
FROM table A,(select @n :=null,@d :=null) X
ORDER BY Name, postedTime


在update前设置变量。
set @n := null, @d := null;
update table a 
inner join (SELECT orderID,Name,postedTime,
                    (@start := CASE WHEN @n = Name AND @d = postedTime
                                            THEN TIMESTAMPADD(Minute, ROUND(RAND()*12)+8, @end)
                                            ELSE TIMESTAMPADD(Minute, ROUND(RAND()*60), concat(postedTime,' 07:30:00'))
                                            END) as starttimes,
                    (@end := TIMESTAMPADD(Minute, ROUND(RAND()*30)+30, @start)) as endtimes,
                    @n := Name,
                    @d := postedTime
                FROM table
                ORDER BY expressName, postedTime) b
on a.orderID = b.orderID
set 
    a.startTime = b.starttimes,
    a.endTime = b.endtimes;

下面是后来写的,目的是根据postTime,时间重置为不重叠(startTime,endTime),且每天最早7:30到最晚18:30,如果超时就顺延一天
但是不知道哪里有问题,时间还是会超过18:30。
在检查和求答案中………………

如果有大神能指点下,在这里先谢谢…………

set @n := null,@d := null,@start := null,@end := null,@t := 0,@ttt := 0;
SELECT orderID,Name,postedTime,orderAmount,
    (@t := CASE WHEN @n = Name AND timediff(concat(DATE_ADD(postedTime,INTERVAL @t DAY),' 18:30'),@end) < 20000
                then @t + 1
                when  @n = Name and @d != postedTime and DATEDIFF(DATE_FORMAT(postedTime,"%Y-%m-%d"),DATE_FORMAT(@end,"%Y-%m-%d")) < 0
                then ABS(DATEDIFF(DATE_FORMAT(postedTime,"%Y-%m-%d"),DATE_FORMAT(@end,"%Y-%m-%d")))
                WHEN @n != Name or (@n = Name and @d != postedTime and DATEDIFF(DATE_FORMAT(postedTime,"%Y-%m-%d"),DATE_FORMAT(@end,"%Y-%m-%d")) > 0)
                then 0
                else CAST(@t as char)
                end) as t,
    (@start := CASE WHEN @n = Name
                                    AND ((@d = postedTime AND @t = @ttt) 
                                    OR (DATEDIFF(postedTime,@d) <= @ttt AND DATEDIFF(postedTime,@d) != 0 AND @ttt != 0))
                                    AND (timediff(concat(postedTime,' 18:30'),@end) > 20000 or timediff(concat(DATE_ADD(postedTime,INTERVAL @t DAY),' 18:30'),@end) > 20000) 
                                THEN (
                                    CASE WHEN (timediff(concat(DATE_FORMAT(@end,'%Y-%m-%d'),' 11:30'),@end) > 0) 
                                    THEN TIMESTAMPADD(Minute, ROUND(RAND()*20)+10, @end)
                                    ELSE TIMESTAMPADD(Minute, ROUND(RAND()*10)+30, @end)
                                    END
                                )
                            ELSE TIMESTAMPADD(Minute, ROUND(RAND()*20), concat(DATE_ADD(postedTime,INTERVAL @t DAY), ' 07:30'))
                            END) as starttimes,
    (@end := CASE WHEN orderAmount > 10000
                                THEN  TIMESTAMPADD(SECOND, ROUND(RAND()*1800)+9000, @start) 
                                ELSE TIMESTAMPADD(SECOND, ROUND(RAND()*3600)+3000, @start)
                                END) as endtimes,
    @ttt := @t,
    @n := Name,
    @d := postedTime
FROM ordertable
WHERE Name is not null AND Name!= '' AND postedTime > '2017-09-30' and postedTime < '2018-03-01'
ORDER BY Name, postedTime
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值