[抛砖引玉]换个思路解决SQL经典问题(一):按每半小时统计

pboy2925 2014-02-07 02:08:49
加精
在开发的过程中,我们常常会遇到类似这种按每半小时统计数量的需求:

CREATE TABLE [dbo].[PerHalfHour]([CallInTime] [smalldatetime] NULL, [Result] [int] NULL);
INSERT [dbo].[PerHalfHour] ([CallInTime], [Result]) VALUES ('2014-01-01 08:20:00', 2);
INSERT [dbo].[PerHalfHour] ([CallInTime], [Result]) VALUES ('2014-01-01 08:38:00', 2);
INSERT [dbo].[PerHalfHour] ([CallInTime], [Result]) VALUES ('2014-01-01 08:43:00', 2);
INSERT [dbo].[PerHalfHour] ([CallInTime], [Result]) VALUES ('2014-01-01 08:49:00', 2);
INSERT [dbo].[PerHalfHour] ([CallInTime], [Result]) VALUES ('2014-01-01 09:07:00', 2);
INSERT [dbo].[PerHalfHour] ([CallInTime], [Result]) VALUES ('2014-01-01 09:07:00', 1);
INSERT [dbo].[PerHalfHour] ([CallInTime], [Result]) VALUES ('2014-01-01 09:10:00', 1);
INSERT [dbo].[PerHalfHour] ([CallInTime], [Result]) VALUES ('2014-01-01 09:16:00', 1);
INSERT [dbo].[PerHalfHour] ([CallInTime], [Result]) VALUES ('2014-01-01 09:41:00', 1);
INSERT [dbo].[PerHalfHour] ([CallInTime], [Result]) VALUES ('2014-01-01 09:44:00', 1);
INSERT [dbo].[PerHalfHour] ([CallInTime], [Result]) VALUES ('2014-01-01 09:52:00', 1);

要求实现:



同样的问题:http://bbs.csdn.net/topics/190165850

技术达人们总是用datediff,datepart,convert等组合起来高,高新手们摸不请此SQL语句的原理。

其实这类问题换个思路,可能解决起来会更简单一些。

查看解决方法 http://jorkin.me/classic-sql-question-1/
...全文
4619 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_23303845 2015-11-24
  • 打赏
  • 举报
回复
楼主,想问一下
Datepart(MINUTE, CallInTime) / 30 * 30 AS CallInTime_Minute 是获取分钟把
AND t0.sequence_minute = t1.CallInTime_Minute 我不明白这个条件,查询出来为什么会有数值?
这个是子查询出来的
然后与 sequence_halfhour 表left join

如何相等?楼主查询为什么会有值?
北冥小渔 2015-11-23
  • 打赏
  • 举报
回复
,希望大神多多分享
qq_23303845 2015-11-23
  • 打赏
  • 举报
回复
为何我输出的不一样?...求解 麻烦看到联系下我,邮箱563279244@qq.com

江南雪_158 2015-08-19
  • 打赏
  • 举报
回复
专注or全面 2014-11-06
  • 打赏
  • 举报
回复

with timetmp
as
(
	select 1 as id, cast('00:00:00' as time(0)) as timeSection
	union all
	select id+1 as id,  cast(dateadd(mi,30,timeSection) as time(0)) as timeSection 
	 from timetmp  where id<49
)
select 
A.timeSection as timeSectionFrom,
B.timeSection as timeSectionTo,
cast(A.timeSection as varchar(10))+'~'+cast(B.timeSection as varchar(10)) as timeSection
from timetmp  A inner join timetmp B on A.id= B.id-1

timeSectionFrom  timeSectionTo    timeSection
---------------- ---------------- ---------------------
00:00:00         00:30:00         00:00:00~00:30:00
00:30:00         01:00:00         00:30:00~01:00:00
01:00:00         01:30:00         01:00:00~01:30:00
01:30:00         02:00:00         01:30:00~02:00:00
02:00:00         02:30:00         02:00:00~02:30:00
02:30:00         03:00:00         02:30:00~03:00:00
03:00:00         03:30:00         03:00:00~03:30:00
03:30:00         04:00:00         03:30:00~04:00:00
04:00:00         04:30:00         04:00:00~04:30:00
04:30:00         05:00:00         04:30:00~05:00:00
05:00:00         05:30:00         05:00:00~05:30:00
05:30:00         06:00:00         05:30:00~06:00:00
06:00:00         06:30:00         06:00:00~06:30:00
06:30:00         07:00:00         06:30:00~07:00:00
07:00:00         07:30:00         07:00:00~07:30:00
07:30:00         08:00:00         07:30:00~08:00:00
08:00:00         08:30:00         08:00:00~08:30:00
08:30:00         09:00:00         08:30:00~09:00:00
09:00:00         09:30:00         09:00:00~09:30:00
09:30:00         10:00:00         09:30:00~10:00:00
10:00:00         10:30:00         10:00:00~10:30:00
10:30:00         11:00:00         10:30:00~11:00:00
11:00:00         11:30:00         11:00:00~11:30:00
11:30:00         12:00:00         11:30:00~12:00:00
12:00:00         12:30:00         12:00:00~12:30:00
12:30:00         13:00:00         12:30:00~13:00:00
13:00:00         13:30:00         13:00:00~13:30:00
13:30:00         14:00:00         13:30:00~14:00:00
14:00:00         14:30:00         14:00:00~14:30:00
14:30:00         15:00:00         14:30:00~15:00:00
15:00:00         15:30:00         15:00:00~15:30:00
15:30:00         16:00:00         15:30:00~16:00:00
16:00:00         16:30:00         16:00:00~16:30:00
16:30:00         17:00:00         16:30:00~17:00:00
17:00:00         17:30:00         17:00:00~17:30:00
17:30:00         18:00:00         17:30:00~18:00:00
18:00:00         18:30:00         18:00:00~18:30:00
18:30:00         19:00:00         18:30:00~19:00:00
19:00:00         19:30:00         19:00:00~19:30:00
19:30:00         20:00:00         19:30:00~20:00:00
20:00:00         20:30:00         20:00:00~20:30:00
20:30:00         21:00:00         20:30:00~21:00:00
21:00:00         21:30:00         21:00:00~21:30:00
21:30:00         22:00:00         21:30:00~22:00:00
22:00:00         22:30:00         22:00:00~22:30:00
22:30:00         23:00:00         22:30:00~23:00:00
23:00:00         23:30:00         23:00:00~23:30:00
23:30:00         00:00:00         23:30:00~00:00:00

(48 行受影响)
专注or全面 2014-11-06
  • 打赏
  • 举报
回复
timeSectionFrom  timeSectionTo    timeSection
---------------- ---------------- ---------------------
00:00:00         00:30:00         00:00:00~00:30:00
00:30:00         01:00:00         00:30:00~01:00:00
01:00:00         01:30:00         01:00:00~01:30:00
01:30:00         02:00:00         01:30:00~02:00:00
02:00:00         02:30:00         02:00:00~02:30:00
02:30:00         03:00:00         02:30:00~03:00:00
03:00:00         03:30:00         03:00:00~03:30:00
03:30:00         04:00:00         03:30:00~04:00:00
04:00:00         04:30:00         04:00:00~04:30:00
04:30:00         05:00:00         04:30:00~05:00:00
05:00:00         05:30:00         05:00:00~05:30:00
05:30:00         06:00:00         05:30:00~06:00:00
06:00:00         06:30:00         06:00:00~06:30:00
06:30:00         07:00:00         06:30:00~07:00:00
07:00:00         07:30:00         07:00:00~07:30:00
07:30:00         08:00:00         07:30:00~08:00:00
08:00:00         08:30:00         08:00:00~08:30:00
08:30:00         09:00:00         08:30:00~09:00:00
09:00:00         09:30:00         09:00:00~09:30:00
09:30:00         10:00:00         09:30:00~10:00:00
10:00:00         10:30:00         10:00:00~10:30:00
10:30:00         11:00:00         10:30:00~11:00:00
11:00:00         11:30:00         11:00:00~11:30:00
11:30:00         12:00:00         11:30:00~12:00:00
12:00:00         12:30:00         12:00:00~12:30:00
12:30:00         13:00:00         12:30:00~13:00:00
13:00:00         13:30:00         13:00:00~13:30:00
13:30:00         14:00:00         13:30:00~14:00:00
14:00:00         14:30:00         14:00:00~14:30:00
14:30:00         15:00:00         14:30:00~15:00:00
15:00:00         15:30:00         15:00:00~15:30:00
15:30:00         16:00:00         15:30:00~16:00:00
16:00:00         16:30:00         16:00:00~16:30:00
16:30:00         17:00:00         16:30:00~17:00:00
17:00:00         17:30:00         17:00:00~17:30:00
17:30:00         18:00:00         17:30:00~18:00:00
18:00:00         18:30:00         18:00:00~18:30:00
18:30:00         19:00:00         18:30:00~19:00:00
19:00:00         19:30:00         19:00:00~19:30:00
19:30:00         20:00:00         19:30:00~20:00:00
20:00:00         20:30:00         20:00:00~20:30:00
20:30:00         21:00:00         20:30:00~21:00:00
21:00:00         21:30:00         21:00:00~21:30:00
21:30:00         22:00:00         21:30:00~22:00:00
22:00:00         22:30:00         22:00:00~22:30:00
22:30:00         23:00:00         22:30:00~23:00:00
23:00:00         23:30:00         23:00:00~23:30:00
23:30:00         00:00:00         23:30:00~00:00:00

(48 行受影响)
reenjie 2014-11-06
  • 打赏
  • 举报
回复
米奇修 2014-02-13
  • 打赏
  • 举报
回复
学习了,谢谢分享,乐于分享的都是大好人~(⊙v⊙)嗯
-江沐风- 2014-02-11
  • 打赏
  • 举报
回复
学习了!
Theflybird 2014-02-11
  • 打赏
  • 举报
回复
string sqlStr = "select * from (Select top(48) count(*)"
+ ",max(Time) as Time "
+ "from DataTable where Time between '"
+ TimeS.ToString() + "' and '" + TimeE.ToString() + "' "
+ " GROUP BY CONVERT(varchar(10), Time, 120) + '-' + RTRIM(DATEPART(dd, Time)) "
+ "order by Time desc)as Tb order by Tb.Time";
供参考
名字委婉点 2014-02-11
  • 打赏
  • 举报
回复
如何取0点开始至今的时间段集合, 间隔1小时 http://bbs.csdn.net/topics/390706187?page=1#post-396722145
  • 打赏
  • 举报
回复
确实厉害!!
allen_spirit 2014-02-10
  • 打赏
  • 举报
回复
i want my cone.
zlmlczcmlvsaav 2014-02-09
  • 打赏
  • 举报
回复
~~不错不错!!~~~~~~
唐诗三百首 2014-02-07
  • 打赏
  • 举报
回复
不错的思路,感谢分享.
line_us 2014-02-07
  • 打赏
  • 举报
回复
看看怎么换个思路。
teemai 2014-02-07
  • 打赏
  • 举报
回复
Yole 2014-02-07
  • 打赏
  • 举报
回复
不错!
LongRui888 2014-02-07
  • 打赏
  • 举报
回复
谢谢分享
發糞塗牆 2014-02-07
  • 打赏
  • 举报
回复

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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