sqlserver的datetime查询

现在表a中有一字段b类型为datetime。要求根据b中保存的值统计出一定日期范围内,每个小时的记录条数。小弟数据库不是很擅长,怎样才能写出一个能达到目的的较为高效的sq... 现在表a中有一字段b类型为datetime。
要求根据b中保存的值统计出一定日期范围内,每个小时的记录条数。
小弟数据库不是很擅长,怎样才能写出一个能达到目的的较为高效的sql语句呢?
一楼的答案跟我要求不太一样啊,可能我没表达清楚。
我是想得出比如一个月内,所有1点钟,2点钟,3点钟……的记录条数。作为一个数据统计。
展开
 我来答
學有止境
推荐于2018-03-13 · TA获得超过194个赞
知道答主
回答量:143
采纳率:0%
帮助的人:0
展开全部
SELECT COUNT(*)/datediff(hour,'2009-06-15 00:00:00','2009-06-28 00:00:00')
from a
where b >= '2009-06-15 00:00:00'and b <= '2009-06-28 00:00:00'

如上是查询6月15日到28日期间,平均每小时记录的数据数目

datediff(hour,'2009-06-15 00:00:00','2009-06-28 00:00:00' --取得日期区间的小时数

------------------------------------------
哦,是我读题不仔细唉,呵呵。
这样的话就复杂了。
你不急的话我明天有空写个预存程序来解决这个问题

------------------------------------------
1.先建立日期时间构造预存程序,用来传回作时间段查询的两个时间
create PROC [dbo].[sp_fordate]
@year char(4),
@month char(2),
@day char(2),
@hour char(2),
@date1 varchar(12) output,
@date2 char(20) output,
@date3 char(20) output
as
begin
set @date1 = @year + '-' + ltrim(rtrim(@month)) + '-' +rtrim(@day)
set @date2 = @date1 + space(1) + ltrim(rtrim(@hour)) + ':00:00'
set @hour = @hour +1
set @date3 = @date1 + space(1) + ltrim(rtrim(@hour)) + ':00:00'
set @hour = @hour -1
set @date1 = @date1 + '-'+ @hour
end

2.在这一个预存程序里用循环跑出一个用union关联的超长sql语句执行。需要传入四个值,年份(2009四位格式),月份,日期(若日期传入为空自动取1),小时(输入1表示1点到2点时段,以此类推)

create proc riqi
@year char(4),
@month char(2),
@day char(2),
@hour char(2)
as
BEGIN
declare @SQL varChar(4000)
if @day is null or @day = ''
begin
set @day = 1
end
declare @date1 char(12)
declare @date2 char(20)
declare @date3 char(20)
exec sp_fordate @year,@month,@day,@hour,@date1 output,@date2 output,@date3 output
set @sql = 'select count(*) as 数目, '''+ @date1 + ''' as 日期时间 from a where b >= ''' + @date2 + '''' + ' and b<= ''' + @date3 + ''''
set @day = @day + 1
while @day <= 31
BEGIN
exec sp_fordate @year,@month,@day,@hour,@date1 output,@date2 output,@date3 output
set @sql = @sql +char(10)+char(13)+ ' union all ' +char(10)+char(13)+ 'select count(*), '''+ @date1 + ''' from a where b >= ''' + @date2 + '''' + ' and b<= ''' + @date3 + ''''
set @day = @day + 1
print @day
if @@error <> ''
BEGIN
break
END
ELSE
CONTINUE
END
exec(@sql)
END

测试结果如下

数目 日期时间
----------- ------------
3 2009-10-1-1
2 2009-10-2-1
1 2009-10-3-1

最后的-1表示时间段是一点

唉,只想到这个笨办法唉
hy1397471
推荐于2016-12-05 · 知道合伙人软件行家
hy1397471
知道合伙人软件行家
采纳数:4714 获赞数:17152
15年数据库维护及数据库应用系统开发经验,从事零售业、服务业及财务管理类系统开发与维护。

向TA提问 私信TA
展开全部

sql的datetime查询使用 convert函数格式化输出格式


convert函数语法:

CONVERT(data_type(length),data_to_be_converted,style)

data_type(length) 规定目标数据类型(带有可选的长度)。data_to_be_converted 含有需要转换的值。style 规定日期/时间的输出格式。

可以使用的 style 值如图:


例:

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
九冠076
2009-10-12 · TA获得超过995个赞
知道小有建树答主
回答量:669
采纳率:0%
帮助的人:618万
展开全部
select b,count(*) From(
select convert(varchar(4), datepart (year, b))+'-'
+convert(varchar(2), datepart (month, b))+'-'
+convert(varchar(2), datepart (day, b))+' '
+convert(varchar(2), datepart (hour, b)) b From a)aa
group by b order by b
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式