在线精品99_中国九九盗摄偷拍偷看_91免费版在线观看_91.app_91高清视频在线_99热最新网站

SQL如何求时间差之和

109次阅读
没有评论

共计 3108 个字符,预计需要花费 8 分钟才能阅读完成。

这篇文章主要介绍了 SQL 如何求时间差之和,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让丸趣 TV 小编带着大家一起了解一下。

题目如下:

求每个品牌的促销天数

表 sale 为促销营销表,数据中存在日期重复的情况,例如 id 为 1 的 end_date 为 20180905,id 为 2 的 start_date 为 20180903,即 id 为 1 和 id 为 2 的存在重复的销售日期,求出每个品牌的促销天数 (重复不算)

表结果如下:

+------+-------+------------+------------+
| id | brand | start_date | end_date |
+------+-------+------------+------------+
| 1 | nike | 2018-09-01 | 2018-09-05 |
| 2 | nike | 2018-09-03 | 2018-09-06 |
| 3 | nike | 2018-09-09 | 2018-09-15 |
| 4 | oppo | 2018-08-04 | 2018-08-05 |
| 5 | oppo | 2018-08-04 | 2018-08-15 |
| 6 | vivo | 2018-08-15 | 2018-08-21 |
| 7 | vivo | 2018-09-02 | 2018-09-12 |
+------+-------+------------+------------+

最终结果应为

brandall_daysnike13oppo12vivo18

建表语句

-- ----------------------------
-- Table structure for sale
-- ----------------------------
DROP TABLE IF EXISTS `sale`;
CREATE TABLE `sale` ( `id` int(11) DEFAULT NULL,
 `brand` varchar(255) DEFAULT NULL,
 `start_date` date DEFAULT NULL,
 `end_date` date DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of sale
-- ----------------------------
INSERT INTO `sale` VALUES (1,  nike ,  2018-09-01 ,  2018-09-05 
INSERT INTO `sale` VALUES (2,  nike ,  2018-09-03 ,  2018-09-06 
INSERT INTO `sale` VALUES (3,  nike ,  2018-09-09 ,  2018-09-15 
INSERT INTO `sale` VALUES (4,  oppo ,  2018-08-04 ,  2018-08-05 
INSERT INTO `sale` VALUES (5,  oppo ,  2018-08-04 ,  2018-08-15 
INSERT INTO `sale` VALUES (6,  vivo ,  2018-08-15 ,  2018-08-21 
INSERT INTO `sale` VALUES (7,  vivo ,  2018-09-02 ,  2018-09-12

方式 1:

利用自关联下一条记录的方法

select brand,sum(end_date-befor_date+1) all_days from 
 (
 select s.id ,
 s.brand ,
 s.start_date ,
 s.end_date , 
 if(s.start_date =ifnull(t.end_date,s.start_date) ,s.start_date,DATE_ADD(t.end_date,interval 1 day) ) as befor_date
 from sale s left join (select id+1 as id ,brand,end_date from sale) t on s.id = t.id and s.brand = t.brand
 order by s.id
 )tmp
 group by brand

运行结果

+-------+---------+
| brand | all_day |
+-------+---------+
| nike | 13 |
| oppo | 12 |
| vivo | 18 |
+-------+---------+

该方法对本题中的表格有效,但对于有 id 不连续的品牌的记录时不一定适用。

方式 2:

SELECT a.brand,SUM(
 CASE 
 WHEN a.start_date=b.start_date AND a.end_date=b.end_date
 AND NOT EXISTS(
 SELECT *
 FROM sale c LEFT JOIN sale d ON c.brand=d.brand 
 WHERE d.brand=a.brand
 AND c.start_date=a.start_date
 AND c.id d.id 
 AND (d.start_date BETWEEN c.start_date AND c.end_date AND d.end_date c.end_date
 OR 
 c.start_date BETWEEN d.start_date AND d.end_date AND c.end_date d.end_date)
 ) 
 THEN (a.end_date-a.start_date+1) 
 WHEN (a.id b.id AND b.start_date BETWEEN a.start_date AND a.end_date AND b.end_date a.end_date ) THEN (b.end_date-a.start_date+1)
 ELSE 0 END
 ) AS all_days 
FROM sale a JOIN sale b ON a.brand=b.brand GROUP BY a.brand

运行结果

+-------+----------+
| brand | all_days |
+-------+----------+
| nike | 13 |
| oppo | 12 |
| vivo | 18 |
+-------+----------+

其中条件

d.start_date BETWEEN c.start_date AND c.end_date AND d.end_date c.end_date
 OR 
c.start_date BETWEEN d.start_date AND d.end_date AND c.end_date d.end_date

可以换成

c.start_date   d.end_date AND (c.end_date   d.start_date)

结果同样正确

用分析函数同样可行的,自己电脑暂时没装 oracle,用的 mysql 写的。

感谢你能够认真阅读完这篇文章,希望丸趣 TV 小编分享的“SQL 如何求时间差之和”这篇文章对大家有帮助,同时也希望大家多多支持丸趣 TV,关注丸趣 TV 行业资讯频道,更多相关知识等着你来学习!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-04发表,共计3108字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)
主站蜘蛛池模板: 亚洲男人天堂手机版 | 久久精品资源 | 日韩精品在线视频观看 | 2019久热精品视频在线看 | 亚洲欧洲精品一区二区三区 | a级片在线观看免费 | 在线观看国产精成人品 | 大陆毛片 | 国产精品久久有声小说 | 一级毛片免费全部播放完整 | 日产精品卡2卡三卡乱码网站 | 成熟丰满熟妇xxxxx丰满 | 亚洲av无码不卡 | 在线观看国产亚洲 | 98精品国产高清在线xxxx | 中文字幕视频一区二区 | 毛片免费毛片一级jjj毛片 | 久久久精品免费国产四虎 | 欧美激情亚洲精品日韩1区2区 | 加勒比一本大道香蕉在线视频 | 亚洲av永久无码精品水牛影视 | 性做久久久久久久久男女 | 亚洲欧洲∨国产一区二区三区 | 日韩欧美在线不卡 | 午夜激情免费视频 | 97在线成人免费视频观看 | 377p欧洲日本亚洲大胆 | 亚洲成人在线视频网站 | 亚洲国产激情一区二区三区 | 网站午夜| 91久久偷偷做嫩草影院免 | 国产精品www夜色视频 | 亚洲国产精品久久网午夜小说 | 131美女爱做视频 | 青草久久久 | 在线精品国精品国产不卡 | 久久青草国产免费观看 | 欧美a在线| 亚洲色图图片区 | 中文无码成人免费视频在线观看 | 国产成人精品日本亚洲语音2 |