求一个解决办法或SQL语句

youzhj 2010-03-31 10:10:45
表stb有字段Sdt(时间字段),f1,Sid,其中Sid是不同设备的id号,每个设备(Sid)的数据是每隔半小时存一次。示例数据如下:

Sdt f1 Sid
--------------------------------------------- ----------------------------------------------
2010-03-24 09:30:00.000 39099.518750000003 17
2010-03-24 09:30:00.000 961480.0 18
2010-03-24 09:30:00.000 246.81279296874999 19
2010-03-24 10:00:00.000 39099.518750000003 17
2010-03-24 10:00:00.000 961584.0 18
2010-03-24 10:00:00.000 247.5 19
2010-03-24 10:30:00.000 39099.518750000003 17
2010-03-24 10:30:00.000 961688.0 18
2010-03-24 10:30:00.000 247.5 19
2010-03-24 11:00:00.000 39099.518750000003 17
2010-03-24 11:00:00.000 961784.0 18
2010-03-24 11:00:00.000 247.5 19
2010-03-24 11:30:00.000 39100.159375000003 17
2010-03-24 11:30:00.000 961888.0 18
2010-03-24 11:30:00.000 248.18720703125001 19
2010-03-24 12:00:00.000 39100.159375000003 17
2010-03-24 12:00:00.000 961992.0 18
2010-03-24 12:00:00.000 248.18720703125001 19
2010-03-24 12:30:00.000 39100.159375000003 17
2010-03-24 12:30:00.000 962088.0 18
2010-03-24 12:30:00.000 248.18720703125001 19

有如下规定:
Timescale Timename
7:00-8:30 平
8:30-9:30 峰
9:30-11:30 尖
11:30-18:00 平
18:00-23:00 峰
23:00-7:00 谷
现在需要根据上述规定,任意给一个时间段,分别统计出符合上述规定的数据,结果字段由Sdt,f1,Sid,Timename组成。
求高手帮帮忙,给一个存储过程或者函数,或者语句,至为感谢!
...全文
123 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
youzhj 2010-03-31
  • 打赏
  • 举报
回复
多谢各位捧场,祝各位发大财!!
youzhj 2010-03-31
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 ws_hgo 的回复:]
引用 17 楼 youzhj 的回复:
看看还有没有别的语句哈,胡哥的语句是正解之一!完全理解了我的意思,多谢哈。

没有问题
就结贴吧
我缺分
[/Quote]ok!
ws_hgo 2010-03-31
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 youzhj 的回复:]
看看还有没有别的语句哈,胡哥的语句是正解之一!完全理解了我的意思,多谢哈。
[/Quote]
没有问题
就结贴吧
我缺分
htl258_Tony 2010-03-31
  • 打赏
  • 举报
回复
终于明白了楼主要什么了
youzhj 2010-03-31
  • 打赏
  • 举报
回复
看看还有没有别的语句哈,胡哥的语句是正解之一!完全理解了我的意思,多谢哈。
ws_hgo 2010-03-31
  • 打赏
  • 举报
回复
那就使用存储过程

create proc getDateInfo
(
@StartTime datetime,
@EndDate datetime
)
as
select Sdt,f1,Sid,
(
case when cast(convert(nvarchar(5),Sdt,114) as datetime) between '7:00' and '8:30' then '平' else
case when cast(convert(nvarchar(5),Sdt,114) as datetime) between '9:30' and '11:30' then '尖' else
case when cast(convert(nvarchar(5),Sdt,114) as datetime) between '11:30' and '18:00' then '平' else
case when cast(convert(nvarchar(5),Sdt,114) as datetime) between '18:00' and '23:00' then '峰' else
'谷' end
end
end
end) 'Timename'
from
(
select * from #TT
where Sdt between @StartTime and @EndDate
) tt

exec getDateInfo '2010-3-24 7:00','2010-3-24 18:00'

Sdt f1 Sid Timename
----------------------- ----------- ----------- --------
2010-03-24 09:30:00.000 39099 17 尖
2010-03-24 09:30:00.000 399 18 尖
2010-03-24 09:30:00.000 39099 19 尖
2010-03-24 10:00:00.000 99 17 尖
2010-03-24 10:00:00.000 399 17 尖
2010-03-24 10:00:00.000 39099 18 尖
2010-03-24 10:30:00.000 399 19 尖
2010-03-24 10:30:00.000 39099 17 尖
2010-03-24 10:30:00.000 399 18 尖
2010-03-24 11:00:00.000 39099 17 尖
2010-03-24 11:00:00.000 39099 17 尖
2010-03-24 11:00:00.000 399 18 尖
2010-03-24 11:30:00.000 39099 19 尖
2010-03-24 11:30:00.000 39099 17 尖
2010-03-24 11:30:00.000 39099 17 尖

(15 行受影响)
youzhj 2010-03-31
  • 打赏
  • 举报
回复
是这样的,我想实现任意输入一个查询时间段,然后就是按前面的那个规定把该时间内的数据统计出来,统计结果样式上面有了。[Quote=引用 9 楼 jjx5373 的回复:]
你有了如下规定:
Timescale Timename
7:00-8:30 平
8:30-9:30 峰
9:30-11:30 尖
11:30-18:00 平
18:00-23:00 峰
23:00-7:00 谷

又有了记录的时间Sdt
那你的这记录的 Timename 就定下来了,
跟你给的时间区间就没有什么关系了啊。
比如 : 给定时间段为2010-3-24 7:00-……
[/Quote]
ws_hgo 2010-03-31
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 youzhj 的回复:]
多谢强大的胡哥!

引用 11 楼 ws_hgo 的回复:
SQL code
修改下

select Sdt,f1,Sid,
(
case when convert(nvarchar(5),Sdt,114) between '7:00' and '8:30' then '平' else
case when convert(nvarchar(5),Sdt,114) between ……
[/Quote]

13楼的为正确答案
ws_hgo 2010-03-31
  • 打赏
  • 举报
回复
create table #TT
(
Sdt datetime,
f1 int,
Sid int
)
insert into #TT select '2010-03-24 09:30:00.000',39099,17
insert into #TT select '2010-03-24 09:30:00.000',399,18
insert into #TT select '2010-03-24 09:30:00.000',39099,19
insert into #TT select '2010-03-24 10:00:00.000',99,17
insert into #TT select '2010-03-24 10:00:00.000',399,17
insert into #TT select '2010-03-24 10:00:00.000',39099,18
insert into #TT select '2010-03-24 10:30:00.000',399,19
insert into #TT select '2010-03-24 10:30:00.000',39099,17
insert into #TT select '2010-03-24 10:30:00.000',399,18
insert into #TT select '2010-03-24 11:00:00.000',39099,17
insert into #TT select '2010-03-24 11:00:00.000',39099,17
insert into #TT select '2010-03-24 11:00:00.000',399,18
insert into #TT select '2010-03-24 11:30:00.000',39099,19
insert into #TT select '2010-03-24 11:30:00.000',39099,17
insert into #TT select '2010-03-24 11:30:00.000',39099,17


select Sdt,f1,Sid,
(
case when cast(convert(nvarchar(5),Sdt,114) as datetime) between '7:00' and '8:30' then '平' else
case when cast(convert(nvarchar(5),Sdt,114) as datetime) between '9:30' and '11:30' then '尖' else
case when cast(convert(nvarchar(5),Sdt,114) as datetime) between '11:30' and '18:00' then '平' else
case when cast(convert(nvarchar(5),Sdt,114) as datetime) between '18:00' and '23:00' then '峰' else
'谷' end
end
end
end) 'Timename'
from
(
select * from #TT
where Sdt between '2010-3-24 7:00' and '2010-3-24 18:00'
) tt

Sdt f1 Sid Timename
----------------------- ----------- ----------- --------
2010-03-24 09:30:00.000 39099 17 尖
2010-03-24 09:30:00.000 399 18 尖
2010-03-24 09:30:00.000 39099 19 尖
2010-03-24 10:00:00.000 99 17 尖
2010-03-24 10:00:00.000 399 17 尖
2010-03-24 10:00:00.000 39099 18 尖
2010-03-24 10:30:00.000 399 19 尖
2010-03-24 10:30:00.000 39099 17 尖
2010-03-24 10:30:00.000 399 18 尖
2010-03-24 11:00:00.000 39099 17 尖
2010-03-24 11:00:00.000 39099 17 尖
2010-03-24 11:00:00.000 399 18 尖
2010-03-24 11:30:00.000 39099 19 尖
2010-03-24 11:30:00.000 39099 17 尖
2010-03-24 11:30:00.000 39099 17 尖

(15 行受影响)
youzhj 2010-03-31
  • 打赏
  • 举报
回复
多谢强大的胡哥![Quote=引用 11 楼 ws_hgo 的回复:]
SQL code
修改下

select Sdt,f1,Sid,
(
case when convert(nvarchar(5),Sdt,114) between '7:00' and '8:30' then '平' else
case when convert(nvarchar(5),Sdt,114) between '……
[/Quote]
ws_hgo 2010-03-31
  • 打赏
  • 举报
回复
修改下

select Sdt,f1,Sid,
(
case when convert(nvarchar(5),Sdt,114) between '7:00' and '8:30' then '平' else
case when convert(nvarchar(5),Sdt,114) between '9:30' and '11:30' then '尖' else
case when convert(nvarchar(5),Sdt,114) between '11:30' and '18:00' then '平' else
case when convert(nvarchar(5),Sdt,114) between '18:00' and '23:00' then '峰' else
'谷' end
end
end
end) 'Timename'
from
(
select * from stb where Sdt between '2010-3-24 7:00' and '2010-3-24 18:00'
) tt
ws_hgo 2010-03-31
  • 打赏
  • 举报
回复

select Sdt,f1,Sid
(case when convert(nvarchar(5),Sdt,114) between '7:00' and '8:30' then '平' else
case when convert(nvarchar(5),Sdt,114) between '9:30' and '11:30' then '尖' else
case when convert(nvarchar(5),Sdt,114) between '11:30' and '18:00' then '平' else
case when convert(nvarchar(5),Sdt,114) between '18:00' and '23:00' then '峰' else
'谷'
end
end
end
end) 'Timename',

select * from stb where Sdt between '2010-3-24 7:00' and '2010-3-24 18:00'
jjx5373 2010-03-31
  • 打赏
  • 举报
回复
你有了如下规定:
Timescale Timename
7:00-8:30 平
8:30-9:30 峰
9:30-11:30 尖
11:30-18:00 平
18:00-23:00 峰
23:00-7:00 谷

又有了记录的时间Sdt
那你的这记录的 Timename 就定下来了,
跟你给的时间区间就没有什么关系了啊。
比如 : 给定时间段为2010-3-24 7:00---2010-3-24 18:00
其中一条数据的结果为:
2010-03-24 10:00:00.000 961584.0 18 尖

当你给定时间段为2010-01-24 01:00---2010-3-24 23:00
这条数据的结果还是这个样子:
2010-03-24 10:00:00.000 961584.0 18 尖


难道你还有什么其他的意思?
youzhj 2010-03-31
  • 打赏
  • 举报
回复
假如给定时间段为2010-3-24 7:00---2010-3-24 18:00
youzhj 2010-03-31
  • 打赏
  • 举报
回复
希望结果:

Sdt f1 Sid Timename
2010-03-24 09:30:00.000 39099.518750000003 17 尖
2010-03-24 09:30:00.000 961480.0 18 尖
2010-03-24 09:30:00.000 246.81279296874999 19 尖
2010-03-24 10:00:00.000 39099.518750000003 17 尖
2010-03-24 10:00:00.000 961584.0 18 尖
2010-03-24 10:00:00.000 247.5 19 尖
2010-03-24 10:30:00.000 39099.518750000003 17 尖
2010-03-24 10:30:00.000 961688.0 18 尖
2010-03-24 10:30:00.000 247.5 19 尖
2010-03-24 11:00:00.000 39099.518750000003 17 尖
2010-03-24 11:00:00.000 961784.0 18 尖
2010-03-24 11:00:00.000 247.5 19 尖
2010-03-24 11:30:00.000 39100.159375000003 17 尖
2010-03-24 11:30:00.000 961888.0 18 尖
2010-03-24 11:30:00.000 248.18720703125001 19 尖
youzhj 2010-03-31
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 xys_777 的回复:]
SQL code
select a.*,(case when convert(varchar(5),sdt,108) between '07:00' and '08:30' then '平'
when convert(varchar(5),sdt,108) between '08:30' and '09:30' then '峰'
when convert(varchar(5),sdt,10……
[/Quote]大哥理解我的意思了,谢谢哈。但是我是说现在任意给定一个时间段,比如tmstart为2010-3-24 7:00,而结束时间tmend为2010-3-24 16:00,我现在就是要统计在该时间段内哪些数据时峰,谷,平,尖。
ws_hgo 2010-03-31
  • 打赏
  • 举报
回复
结果是怎么样的啊
youzhj 2010-03-31
  • 打赏
  • 举报
回复
额,就是用电嘛,有个高峰期,低估期,就像一个曲线的平峰尖谷,这个就是供电局规定的,哪个时间段是峰,哪个时间又是平,或谷,这是人为规定的。
永生天地 2010-03-31
  • 打赏
  • 举报
回复


select a.*,(case when convert(varchar(5),sdt,108) between '07:00' and '08:30' then '平' 
when convert(varchar(5),sdt,108) between '08:30' and '09:30' then '峰'
when convert(varchar(5),sdt,108) between '09:30' and '11:30' then '尖'
when convert(varchar(5),sdt,108) between '11:30' and '18:00' then '平'
when convert(varchar(5),sdt,108) between '18:00' and '23:00' then '峰'
when convert(varchar(5),sdt,108) between '23:30' and '07:00' then '谷'
end) Timename from sdt a
htl258_Tony 2010-03-31
  • 打赏
  • 举报
回复
什么叫平峰尖谷
加载更多回复(1)

34,576

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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