如何按照时间段进行数据统计?

时间:2022-11-05 11:25:22
时间                                        订单内容
2015-01-01 22:21:14                订单1


数据类似于这样,但是每天都有订单,我现在想统计出2015年全年中每天22时至转天7时这个时间段内共计有多少笔订单,请问这个怎么统计?谢谢

12 个解决方案

#1


中每天22时至转天7时这个时间

每天出一条数据,还是出两条数据 ?

#2


每天订单大概100多个,22时至转天7时有可能存在大概40多个订单,我就是想统计一下每天这个时段订单的总笔数。
例如 
2015-01-01   5笔
2015-01-02   20笔

类似于这样的,谢谢

#3


本帖最后由 roy_88 于 2016-05-22 08:36:14 编辑
2015-01-01   5笔
统计为 2015-01-01  22:00~2015-01-02 07::00
这样用

select a.时间,b.Con
from (select distinct CONVERT(varchar(10),a.时间,120) as 时间 from Orders) as a
cross apply(select COUNT(1) from orders where CONVERT(varchar(16),时间,120) between a.时间+' 22:00' and convert(varchar(10),dateadd(dd,1,a.时间),120)+' 07:00') as b (Con)

#4


引用 3 楼 roy_88 的回复:
2015-01-01   5笔
统计为 2015-01-01  22:00~2015-01-02 07::00
这样用

select a.时间,b.Con
from (select distinct CONVERT(varchar(10),a.时间,120) as 时间 from Orders) as a
cross apply(select COUNT(1) from orders where CONVERT(varchar(16),时间,120) between a.时间+' 22:00' and convert(varchar(10),dateadd(dd,1,a.时间),120)+' 07:00') as b (Con)


sql server 2000好像没有cross apply吧?

#5


把今天 0 点到 7 点的数据,算到昨天吗 ?

#6



-- 把日时间减去 7 个小时,相当于把今天7 点前的数据移到了昨天
select convert(varchar(10),dateadd(hour,-7, crdate),121) , sum(id)  
from sysobjects
-- 这里取原始数据的小时数,条件写 >= 22 or <= 7
where Datename(hour, crdate) >=22 or Datename(hour, crdate) <=7
group by convert(varchar(10),dateadd(hour, -7, crdate),121) 

#7


引用 4 楼 qq_29194957 的回复:
Quote: 引用 3 楼 roy_88 的回复:

2015-01-01   5笔
统计为 2015-01-01  22:00~2015-01-02 07::00
这样用

select a.时间,b.Con
from (select distinct CONVERT(varchar(10),a.时间,120) as 时间 from Orders) as a
cross apply(select COUNT(1) from orders where CONVERT(varchar(16),时间,120) between a.时间+' 22:00' and convert(varchar(10),dateadd(dd,1,a.时间),120)+' 07:00') as b (Con)


sql server 2000好像没有cross apply吧?


SQL2000只能这样用


select a.时间,COUNT(b.时间) as con
from (select distinct CONVERT(varchar(10),a.时间,120) as 时间 from Orders) as a
    left join orders as b on CONVERT(varchar(16),b.时间,120) between a.时间+' 22:00' and convert(varchar(10),dateadd(dd,1,a.时间),120)+' 07:00'
  group by a.时间

#8


引用 6 楼 wmxcn2000 的回复:

-- 把日时间减去 7 个小时,相当于把今天7 点前的数据移到了昨天
select convert(varchar(10),dateadd(hour,-7, crdate),121) , sum(id)  
from sysobjects
-- 这里取原始数据的小时数,条件写 >= 22 or <= 7
where Datename(hour, crdate) >=22 or Datename(hour, crdate) <=7
group by convert(varchar(10),dateadd(hour, -7, crdate),121) 



如果遇到其中一天22时至转天7时没有订单,应该显示这天是0,可是按照上面的语句,没输出这一天,请问该怎么改?谢谢

#9


引用 7 楼 roy_88 的回复:
Quote: 引用 4 楼 qq_29194957 的回复:

Quote: 引用 3 楼 roy_88 的回复:

2015-01-01   5笔
统计为 2015-01-01  22:00~2015-01-02 07::00
这样用

select a.时间,b.Con
from (select distinct CONVERT(varchar(10),a.时间,120) as 时间 from Orders) as a
cross apply(select COUNT(1) from orders where CONVERT(varchar(16),时间,120) between a.时间+' 22:00' and convert(varchar(10),dateadd(dd,1,a.时间),120)+' 07:00') as b (Con)


sql server 2000好像没有cross apply吧?


SQL2000只能这样用


select a.时间,COUNT(b.时间) as con
from (select distinct CONVERT(varchar(10),a.时间,120) as 时间 from Orders) as a
    left join orders as b on CONVERT(varchar(16),b.时间,120) between a.时间+' 22:00' and convert(varchar(10),dateadd(dd,1,a.时间),120)+' 07:00'
  group by a.时间



这样做执行效率特别低,我数据库里2015年3万多条,统计出来365天的数据用了30多秒,不知道为什么

#10



select a.时间,COUNT(b.时间) as con
from (select distinct CONVERT(varchar(10),a.时间,120) as 时间 from Orders) as a
    left join orders as b on  b.时间 between a.时间+' 22:00' and convert(varchar(10),dateadd(dd,1,a.时间),120)+' 07:00'
  group by a.时间


改改在时间列建上索引再测效率 

#11


引用 8 楼 qq_29194957的回复:
Quote: 引用 6 楼 wmxcn2000 的回复:


-- 把日时间减去 7 个小时,相当于把今天7 点前的数据移到了昨天
select convert(varchar(10),dateadd(hour,-7, crdate),121) , sum(id)  
from sysobjects
-- 这里取原始数据的小时数,条件写 >= 22 or <= 7
where Datename(hour, crdate) >=22 or Datename(hour, crdate) <=7
group by convert(varchar(10),dateadd(hour, -7, crdate),121) 



如果遇到其中一天22时至转天7时没有订单,应该显示这天是0,可是按照上面的语句,没输出这一天,请问该怎么改?谢谢

再写一层,用left join

#12


引用 11 楼 wmxcn2000 的回复:
Quote: 引用 8 楼 qq_29194957的回复:
Quote: 引用 6 楼 wmxcn2000 的回复:


-- 把日时间减去 7 个小时,相当于把今天7 点前的数据移到了昨天
select convert(varchar(10),dateadd(hour,-7, crdate),121) , sum(id)  
from sysobjects
-- 这里取原始数据的小时数,条件写 >= 22 or <= 7
where Datename(hour, crdate) >=22 or Datename(hour, crdate) <=7
group by convert(varchar(10),dateadd(hour, -7, crdate),121) 



如果遇到其中一天22时至转天7时没有订单,应该显示这天是0,可是按照上面的语句,没输出这一天,请问该怎么改?谢谢

再写一层,用left join


left join 中 on怎么写?a.时间=b.时间?刚才试了,不管用啊!

#1


中每天22时至转天7时这个时间

每天出一条数据,还是出两条数据 ?

#2


每天订单大概100多个,22时至转天7时有可能存在大概40多个订单,我就是想统计一下每天这个时段订单的总笔数。
例如 
2015-01-01   5笔
2015-01-02   20笔

类似于这样的,谢谢

#3


本帖最后由 roy_88 于 2016-05-22 08:36:14 编辑
2015-01-01   5笔
统计为 2015-01-01  22:00~2015-01-02 07::00
这样用

select a.时间,b.Con
from (select distinct CONVERT(varchar(10),a.时间,120) as 时间 from Orders) as a
cross apply(select COUNT(1) from orders where CONVERT(varchar(16),时间,120) between a.时间+' 22:00' and convert(varchar(10),dateadd(dd,1,a.时间),120)+' 07:00') as b (Con)

#4


引用 3 楼 roy_88 的回复:
2015-01-01   5笔
统计为 2015-01-01  22:00~2015-01-02 07::00
这样用

select a.时间,b.Con
from (select distinct CONVERT(varchar(10),a.时间,120) as 时间 from Orders) as a
cross apply(select COUNT(1) from orders where CONVERT(varchar(16),时间,120) between a.时间+' 22:00' and convert(varchar(10),dateadd(dd,1,a.时间),120)+' 07:00') as b (Con)


sql server 2000好像没有cross apply吧?

#5


把今天 0 点到 7 点的数据,算到昨天吗 ?

#6



-- 把日时间减去 7 个小时,相当于把今天7 点前的数据移到了昨天
select convert(varchar(10),dateadd(hour,-7, crdate),121) , sum(id)  
from sysobjects
-- 这里取原始数据的小时数,条件写 >= 22 or <= 7
where Datename(hour, crdate) >=22 or Datename(hour, crdate) <=7
group by convert(varchar(10),dateadd(hour, -7, crdate),121) 

#7


引用 4 楼 qq_29194957 的回复:
Quote: 引用 3 楼 roy_88 的回复:

2015-01-01   5笔
统计为 2015-01-01  22:00~2015-01-02 07::00
这样用

select a.时间,b.Con
from (select distinct CONVERT(varchar(10),a.时间,120) as 时间 from Orders) as a
cross apply(select COUNT(1) from orders where CONVERT(varchar(16),时间,120) between a.时间+' 22:00' and convert(varchar(10),dateadd(dd,1,a.时间),120)+' 07:00') as b (Con)


sql server 2000好像没有cross apply吧?


SQL2000只能这样用


select a.时间,COUNT(b.时间) as con
from (select distinct CONVERT(varchar(10),a.时间,120) as 时间 from Orders) as a
    left join orders as b on CONVERT(varchar(16),b.时间,120) between a.时间+' 22:00' and convert(varchar(10),dateadd(dd,1,a.时间),120)+' 07:00'
  group by a.时间

#8


引用 6 楼 wmxcn2000 的回复:

-- 把日时间减去 7 个小时,相当于把今天7 点前的数据移到了昨天
select convert(varchar(10),dateadd(hour,-7, crdate),121) , sum(id)  
from sysobjects
-- 这里取原始数据的小时数,条件写 >= 22 or <= 7
where Datename(hour, crdate) >=22 or Datename(hour, crdate) <=7
group by convert(varchar(10),dateadd(hour, -7, crdate),121) 



如果遇到其中一天22时至转天7时没有订单,应该显示这天是0,可是按照上面的语句,没输出这一天,请问该怎么改?谢谢

#9


引用 7 楼 roy_88 的回复:
Quote: 引用 4 楼 qq_29194957 的回复:

Quote: 引用 3 楼 roy_88 的回复:

2015-01-01   5笔
统计为 2015-01-01  22:00~2015-01-02 07::00
这样用

select a.时间,b.Con
from (select distinct CONVERT(varchar(10),a.时间,120) as 时间 from Orders) as a
cross apply(select COUNT(1) from orders where CONVERT(varchar(16),时间,120) between a.时间+' 22:00' and convert(varchar(10),dateadd(dd,1,a.时间),120)+' 07:00') as b (Con)


sql server 2000好像没有cross apply吧?


SQL2000只能这样用


select a.时间,COUNT(b.时间) as con
from (select distinct CONVERT(varchar(10),a.时间,120) as 时间 from Orders) as a
    left join orders as b on CONVERT(varchar(16),b.时间,120) between a.时间+' 22:00' and convert(varchar(10),dateadd(dd,1,a.时间),120)+' 07:00'
  group by a.时间



这样做执行效率特别低,我数据库里2015年3万多条,统计出来365天的数据用了30多秒,不知道为什么

#10



select a.时间,COUNT(b.时间) as con
from (select distinct CONVERT(varchar(10),a.时间,120) as 时间 from Orders) as a
    left join orders as b on  b.时间 between a.时间+' 22:00' and convert(varchar(10),dateadd(dd,1,a.时间),120)+' 07:00'
  group by a.时间


改改在时间列建上索引再测效率 

#11


引用 8 楼 qq_29194957的回复:
Quote: 引用 6 楼 wmxcn2000 的回复:


-- 把日时间减去 7 个小时,相当于把今天7 点前的数据移到了昨天
select convert(varchar(10),dateadd(hour,-7, crdate),121) , sum(id)  
from sysobjects
-- 这里取原始数据的小时数,条件写 >= 22 or <= 7
where Datename(hour, crdate) >=22 or Datename(hour, crdate) <=7
group by convert(varchar(10),dateadd(hour, -7, crdate),121) 



如果遇到其中一天22时至转天7时没有订单,应该显示这天是0,可是按照上面的语句,没输出这一天,请问该怎么改?谢谢

再写一层,用left join

#12


引用 11 楼 wmxcn2000 的回复:
Quote: 引用 8 楼 qq_29194957的回复:
Quote: 引用 6 楼 wmxcn2000 的回复:


-- 把日时间减去 7 个小时,相当于把今天7 点前的数据移到了昨天
select convert(varchar(10),dateadd(hour,-7, crdate),121) , sum(id)  
from sysobjects
-- 这里取原始数据的小时数,条件写 >= 22 or <= 7
where Datename(hour, crdate) >=22 or Datename(hour, crdate) <=7
group by convert(varchar(10),dateadd(hour, -7, crdate),121) 



如果遇到其中一天22时至转天7时没有订单,应该显示这天是0,可是按照上面的语句,没输出这一天,请问该怎么改?谢谢

再写一层,用left join


left join 中 on怎么写?a.时间=b.时间?刚才试了,不管用啊!