22,210
社区成员
发帖
与我相关
我的任务
分享
--步骤1(把这些数据插入一个表,比如tab)
SELECT 0 number UNION ALL
SELECT 1 number UNION ALL
SELECT 2 number UNION ALL
SELECT 3 number UNION ALL
SELECT 4 number UNION ALL
SELECT 5 number UNION ALL
SELECT 6 number UNION ALL
SELECT 7 number UNION ALL
SELECT 8 number UNION ALL
SELECT 9 number UNION ALL
SELECT 10 number UNION ALL
SELECT 11 number UNION ALL
SELECT 12 number UNION ALL
SELECT 13 number UNION ALL
SELECT 14 number UNION ALL
SELECT 15 number UNION ALL
SELECT 16 number UNION ALL
SELECT 17 number UNION ALL
SELECT 18 number UNION ALL
SELECT 19 number UNION ALL
SELECT 20 number UNION ALL
SELECT 21 number UNION ALL
SELECT 22 number UNION ALL
SELECT 23 number;
--步骤2(把这个结果插入一个表,比如tab2)
--start_hour 开始小时
--end_hour 结束小时
--days 两个日期的间隔天数-1(这个很重要,理解这里的-1是关键)
SELECT *,
hour(start_time) AS start_hour,
hour(end_time) AS end_hour,
DATEDIFF(end_time,start_time) -1 AS days
FROM share_time;
--步骤3(合并下面两个结果集到一个表,比如tab3)
--3.1(结果集1)
select * from tab2 as b
inner join tab as a
on a.number between b.start_hour and 23;
--3.2(结果集2)
select * from tab2 as b
inner join tab as a
on a.number between 0 and b.end_hour;
--步骤4(把步骤3的结果,通过右连接tab表,按照tab表的number合计总数插入到一个表,比如 tab4)
SELECT b.number,COUNT(a.number) AS cnt
FROM tab3 AS a
RIGHT JOIN tab AS b ON a.number=b.number;
--步骤5(合计步骤2中所有的间隔天数,插入到一个表,比如 tab5)
SELECT SUM(days) AS num FROM tab2
--步骤6(用tab4的结果中的cnt + tab5中的num就得到结果了)
select a.number,b.cnt+b.num AS cnt from tab4 as a
inner JOIN tab5 AS b ON 1=1
逻辑大概就是上面这样的。
delete from share_time;
insert into share_time values("2019-07-10 08:10","2019-07-11 12:00",1);
insert into share_time values("2019-07-08 11:10","2019-07-11 08:00",1);
insert into share_time values("2019-07-11 08:10","2019-07-11 12:00",1);
select * from share_time;
create TEMPORARY table tab(
number int
);
insert into tab
SELECT 0 number UNION ALL
SELECT 1 number UNION ALL
SELECT 2 number UNION ALL
SELECT 3 number UNION ALL
SELECT 4 number UNION ALL
SELECT 5 number UNION ALL
SELECT 6 number UNION ALL
SELECT 7 number UNION ALL
SELECT 8 number UNION ALL
SELECT 9 number UNION ALL
SELECT 10 number UNION ALL
SELECT 11 number UNION ALL
SELECT 12 number UNION ALL
SELECT 13 number UNION ALL
SELECT 14 number UNION ALL
SELECT 15 number UNION ALL
SELECT 16 number UNION ALL
SELECT 17 number UNION ALL
SELECT 18 number UNION ALL
SELECT 19 number UNION ALL
SELECT 20 number UNION ALL
SELECT 21 number UNION ALL
SELECT 22 number UNION ALL
SELECT 23 number;
create table tab2(
SELECT *,
hour(start_time) AS start_hour,
hour(end_time) AS end_hour,
DATEDIFF(end_time,start_time) -1 AS days
FROM share_time
);
create table tab3(
select * from tab2 as b
inner join tab as a
on a.number between b.start_hour and 23
);
create table tab4(
select * from tab2 as b
inner join tab as a
on a.number between 0 and b.end_hour
);
select b.*,b.num+c.num from (
select d.number,count(a.number) as num from (
select * from tab3
union ALL
select * from tab4
) as a
right join tab as d on a.number=d.number
group by d.number
)as b
inner join (
select sum(days) as num from tab2
) as c
on 1=1 ;
这个是mysql代码,mysql用的少,写的有点乱[/quote]请教下,用inner join的话只会查有的,但是我想那些没有的时间也查出来,就是从0-24,没有数量的就给个默认值0,但是我改为left join之后,那些没有数量的都有个默认值1
--步骤1(把这些数据插入一个表,比如tab)
SELECT 0 number UNION ALL
SELECT 1 number UNION ALL
SELECT 2 number UNION ALL
SELECT 3 number UNION ALL
SELECT 4 number UNION ALL
SELECT 5 number UNION ALL
SELECT 6 number UNION ALL
SELECT 7 number UNION ALL
SELECT 8 number UNION ALL
SELECT 9 number UNION ALL
SELECT 10 number UNION ALL
SELECT 11 number UNION ALL
SELECT 12 number UNION ALL
SELECT 13 number UNION ALL
SELECT 14 number UNION ALL
SELECT 15 number UNION ALL
SELECT 16 number UNION ALL
SELECT 17 number UNION ALL
SELECT 18 number UNION ALL
SELECT 19 number UNION ALL
SELECT 20 number UNION ALL
SELECT 21 number UNION ALL
SELECT 22 number UNION ALL
SELECT 23 number;
--步骤2(把这个结果插入一个表,比如tab2)
--start_hour 开始小时
--end_hour 结束小时
--days 两个日期的间隔天数-1(这个很重要,理解这里的-1是关键)
SELECT *,
hour(start_time) AS start_hour,
hour(end_time) AS end_hour,
DATEDIFF(end_time,start_time) -1 AS days
FROM share_time;
--步骤3(合并下面两个结果集到一个表,比如tab3)
--3.1(结果集1)
select * from tab2 as b
inner join tab as a
on a.number between b.start_hour and 23;
--3.2(结果集2)
select * from tab2 as b
inner join tab as a
on a.number between 0 and b.end_hour;
--步骤4(把步骤3的结果,通过右连接tab表,按照tab表的number合计总数插入到一个表,比如 tab4)
SELECT b.number,COUNT(a.number) AS cnt
FROM tab3 AS a
RIGHT JOIN tab AS b ON a.number=b.number;
--步骤5(合计步骤2中所有的间隔天数,插入到一个表,比如 tab5)
SELECT SUM(days) AS num FROM tab2
--步骤6(用tab4的结果中的cnt + tab5中的num就得到结果了)
select a.number,b.cnt+b.num AS cnt from tab4 as a
inner JOIN tab5 AS b ON 1=1
逻辑大概就是上面这样的。
delete from share_time;
insert into share_time values("2019-07-10 08:10","2019-07-11 12:00",1);
insert into share_time values("2019-07-08 11:10","2019-07-11 08:00",1);
insert into share_time values("2019-07-11 08:10","2019-07-11 12:00",1);
select * from share_time;
create TEMPORARY table tab(
number int
);
insert into tab
SELECT 0 number UNION ALL
SELECT 1 number UNION ALL
SELECT 2 number UNION ALL
SELECT 3 number UNION ALL
SELECT 4 number UNION ALL
SELECT 5 number UNION ALL
SELECT 6 number UNION ALL
SELECT 7 number UNION ALL
SELECT 8 number UNION ALL
SELECT 9 number UNION ALL
SELECT 10 number UNION ALL
SELECT 11 number UNION ALL
SELECT 12 number UNION ALL
SELECT 13 number UNION ALL
SELECT 14 number UNION ALL
SELECT 15 number UNION ALL
SELECT 16 number UNION ALL
SELECT 17 number UNION ALL
SELECT 18 number UNION ALL
SELECT 19 number UNION ALL
SELECT 20 number UNION ALL
SELECT 21 number UNION ALL
SELECT 22 number UNION ALL
SELECT 23 number;
create table tab2(
SELECT *,
hour(start_time) AS start_hour,
hour(end_time) AS end_hour,
DATEDIFF(end_time,start_time) -1 AS days
FROM share_time
);
create table tab3(
select * from tab2 as b
inner join tab as a
on a.number between b.start_hour and 23
);
create table tab4(
select * from tab2 as b
inner join tab as a
on a.number between 0 and b.end_hour
);
select b.*,b.num+c.num from (
select d.number,count(a.number) as num from (
select * from tab3
union ALL
select * from tab4
) as a
right join tab as d on a.number=d.number
group by d.number
)as b
inner join (
select sum(days) as num from tab2
) as c
on 1=1 ;
这个是mysql代码,mysql用的少,写的有点乱[/quote]羡慕,逻辑条理清晰,我咋就想不到
--步骤1(把这些数据插入一个表,比如tab)
SELECT 0 number UNION ALL
SELECT 1 number UNION ALL
SELECT 2 number UNION ALL
SELECT 3 number UNION ALL
SELECT 4 number UNION ALL
SELECT 5 number UNION ALL
SELECT 6 number UNION ALL
SELECT 7 number UNION ALL
SELECT 8 number UNION ALL
SELECT 9 number UNION ALL
SELECT 10 number UNION ALL
SELECT 11 number UNION ALL
SELECT 12 number UNION ALL
SELECT 13 number UNION ALL
SELECT 14 number UNION ALL
SELECT 15 number UNION ALL
SELECT 16 number UNION ALL
SELECT 17 number UNION ALL
SELECT 18 number UNION ALL
SELECT 19 number UNION ALL
SELECT 20 number UNION ALL
SELECT 21 number UNION ALL
SELECT 22 number UNION ALL
SELECT 23 number;
--步骤2(把这个结果插入一个表,比如tab2)
--start_hour 开始小时
--end_hour 结束小时
--days 两个日期的间隔天数-1(这个很重要,理解这里的-1是关键)
SELECT *,
hour(start_time) AS start_hour,
hour(end_time) AS end_hour,
DATEDIFF(end_time,start_time) -1 AS days
FROM share_time;
--步骤3(合并下面两个结果集到一个表,比如tab3)
--3.1(结果集1)
select * from tab2 as b
inner join tab as a
on a.number between b.start_hour and 23;
--3.2(结果集2)
select * from tab2 as b
inner join tab as a
on a.number between 0 and b.end_hour;
--步骤4(把步骤3的结果,通过右连接tab表,按照tab表的number合计总数插入到一个表,比如 tab4)
SELECT b.number,COUNT(a.number) AS cnt
FROM tab3 AS a
RIGHT JOIN tab AS b ON a.number=b.number;
--步骤5(合计步骤2中所有的间隔天数,插入到一个表,比如 tab5)
SELECT SUM(days) AS num FROM tab2
--步骤6(用tab4的结果中的cnt + tab5中的num就得到结果了)
select a.number,b.cnt+b.num AS cnt from tab4 as a
inner JOIN tab5 AS b ON 1=1
逻辑大概就是上面这样的。
delete from share_time;
insert into share_time values("2019-07-10 08:10","2019-07-11 12:00",1);
insert into share_time values("2019-07-08 11:10","2019-07-11 08:00",1);
insert into share_time values("2019-07-11 08:10","2019-07-11 12:00",1);
select * from share_time;
create TEMPORARY table tab(
number int
);
insert into tab
SELECT 0 number UNION ALL
SELECT 1 number UNION ALL
SELECT 2 number UNION ALL
SELECT 3 number UNION ALL
SELECT 4 number UNION ALL
SELECT 5 number UNION ALL
SELECT 6 number UNION ALL
SELECT 7 number UNION ALL
SELECT 8 number UNION ALL
SELECT 9 number UNION ALL
SELECT 10 number UNION ALL
SELECT 11 number UNION ALL
SELECT 12 number UNION ALL
SELECT 13 number UNION ALL
SELECT 14 number UNION ALL
SELECT 15 number UNION ALL
SELECT 16 number UNION ALL
SELECT 17 number UNION ALL
SELECT 18 number UNION ALL
SELECT 19 number UNION ALL
SELECT 20 number UNION ALL
SELECT 21 number UNION ALL
SELECT 22 number UNION ALL
SELECT 23 number;
create table tab2(
SELECT *,
hour(start_time) AS start_hour,
hour(end_time) AS end_hour,
DATEDIFF(end_time,start_time) -1 AS days
FROM share_time
);
create table tab3(
select * from tab2 as b
inner join tab as a
on a.number between b.start_hour and 23
);
create table tab4(
select * from tab2 as b
inner join tab as a
on a.number between 0 and b.end_hour
);
select b.*,b.num+c.num from (
select d.number,count(a.number) as num from (
select * from tab3
union ALL
select * from tab4
) as a
right join tab as d on a.number=d.number
group by d.number
)as b
inner join (
select sum(days) as num from tab2
) as c
on 1=1 ;
这个是mysql代码,mysql用的少,写的有点乱