Select 上网时间分段,Count(用户名) as 上网人数
from 
(
Select Distinct 用户名,上网时间分段=小时
from 
源表
) T
Group By 上网时间分段
--其中  上网时间分段=小时,是采用某种方式保留上网时间的小时数,例如8:10->8:00

解决方案 »

  1.   

    源表
    后面增加限制条件
    Where 上网时间=:上网时间过滤
      

  2.   

    to:9527(我靠,还是提交不上去!CSDN我服了你)
    谢谢你的回答,请问:
    --其中  上网时间分段=小时,是采用某种方式保留上网时间的小时数,例如8:10->8:00
    这个‘采用某种方式保留上网时间的小时数’这个方式是什么呀,我没在你的语句里看到这个方式呀!
      

  3.   

    还有 请问group by 前面的T表示意思呀??是打错了吗?
      

  4.   

    还有请问:
    T
    Group By 上网时间分段
    这个T表示什么??是打错了吗??
      

  5.   

    要从DateTime型的字段中分离出小时一级的精度确实非常困难,而切不易实现。
    我一贯的作法是将日期型的数据我都定义为Varchar(8),这样,我的SQL语句非常容易实现按年、月、日进行的汇总操作。
    对于你的这个问题,我建议你通过数据库结构调整来实现要比较容易一些。比如将“上网时间段”字段细分为“日期”和“时间”。
      

  6.   

    to:GreenCsdn(稻草人) 
    那请问如果分成2个字段,日期和 时间后,我要实现上面的功能这个语句该怎么写?
      

  7.   

    select distinct DATEPART(hour,上网时间),count(*) from 表
    where 
    groupby  DATEPART(hour,上网时间)
      

  8.   

    小朱的方法是对的,这也行:SELECT Hour([上网时间]) AS 上网时间段, Count(用户名) AS 人数
    FROM 表
    GROUP BY Hour([上网时间]);
      

  9.   

    to :  zyj320621(小朱) (
    我试了一下你的程序,系统提示  DATEPART(hour,上网时间)附近有语法错误呀!
      

  10.   

    to:drc(drc) 
    我用你的方法系统提示HOUR是不可识别的函数名,顺便问一下,这个HOUR表示什么呀??
      

  11.   

    只要截取上网时间的日期和小时(24时制),然后分组即可,
    用户名   上网时段
    王一      2002-1-1  7
    王二      2002-1-1  7
    王三      2002-1-1  8
    王四      2002-1-2  7
    王一      2002-1-1  7
    王二      2002-2-1  10
    王一      2002-1-1  9
    ..         ..
    ..         ..
    ..         ..不知你的DataBase是什么,看来不是SQL Server,Oracle中实现如下:SELECT TO_CHAR(上网时间,'YYYY-MI-DD HH24') AS 时段,COUNT(用户名) 人数 FROM TABLENAME
    GROUP BY TO_CHAR(上网时间,'YYYY-MI-DD HH24')
      

  12.   

    to:chao_jian() 
    数据库是SQL server 2000
      

  13.   

    关键是截取时间的小时数字.oracle 中用to_char(上网时间,'HH24') as 时段
    sql_server你可以查查手册
    语句是这样的形式
    SELECT TO_CHAR(上网时间,'HH24') AS 时段,COUNT(用户名) 人数 FROM TABLENAME
    where trunc(上网时间)=:日期
    GROUP BY TO_CHAR(上网时间,'HH24')
      

  14.   

    请试试:SELECT CONVERT(CHAR(14),上网时间) AS 时段,COUNT(用户名) 人数 
    FROM TABLENAME
    GROUP BY CONVERT(CHAR(14),上网时间)
      

  15.   

    to:chao_jian() 
    我试了你的方法,系统提示(CHAR(14),上网时间) 这个逗号附近有错误 呀!
      

  16.   

    to:zyj320621(小朱)  
    我按照你的方法已经基本可以了,但有个遗憾,按照你的方法出来的,时间段的那个字段名字 是: COLUMN1, 请问有没有方法把这个字段名字改成我想要的呀!
      

  17.   

    to:zyj320621(小朱)  
    对不起,我又发现了一个问题,按照你的方法我不能加 where 条件限制呀,
    一加上where 语句,就无法统计了,表是空的了。
      

  18.   

    to:wd2306(木头) 
    但现在我执行时有错误呀,实现不了呀。
      

  19.   

    to:zyj320621(小朱)  
    请问你在不在呀,按照你的方法,人数可以统计出来了,但加不了条件where
    呀,现在统计出来的是所有日期的人数,我想选一天的都不行呀,还有这个新字段的名字也显示不出来的,请问该怎么解决呀!
      

  20.   

    to:zyj320621(小朱)  
    请问你在不在呀,按照你的方法,人数可以统计出来了,但加不了条件where
    呀,现在统计出来的是所有日期的人数,我想选一天的都不行呀,请问该怎么解决呀!就差这一点了呀!
      

  21.   

    --小朱的方法
    select distinct DATEPART(hour,上网时间) as 你想要的字段名,count(*) as 上网人数
    from 表
    where 上网时间=GetDate()
    group by  DATEPART(hour,上网时间)
    --不过我觉得执行结果不一定对--我的方法
    Select 上网时间分段,Count(用户名) as 上网人数
    from 
    (
    Select Distinct 用户名,上网时间分段=DatePart(Hour,上网时间)
    from 

    Where 上网时间=GetDate()  
    --GetDate()替换成过滤用的时间
    ) T
    Group By 上网时间分段
    --其中T是采用嵌套语句时引入的类似临时表名的东西,不用管他(不写要报错呦)当然如能确定第一种方式没问题,我推荐第一种。
      

  22.   

    to:zyj320621(小朱)  
    我试着加了几条数据,发现还是有错呀,你的方法把同一个人连续在
    7:00-8:00之间上网的次数算了,如:一个人在7:00--8:00之间上了3次网,你在人数统计上就加了3。而我希望统计出的人数是1个人呀,也就是说同一个人无论在7:00-8:00之间上几次网,都统计为1,只有8:00以后再上网才能在人数这个字段上再加1。请问该怎么解决呀。
      

  23.   

    to:9527(我靠,还是提交不上去!CSDN我服了你) 
    谢谢你的再次回答,你的方法我试了,没错可以统计出。但在 用
    Where 上网时间=GetDate()
    就是有错误,我也不知道为什么,我相信你的代码是没问题的。我说明一下,
    我在表里再加了个字段,日期。在上网时间的字段里就只输入时间了,不输入
    日期了,然后根据你的程序在  
    Where 上网时间=GetDate()上,写了
    Where 日期=2002-1-1
    执行一下得到的表是空的,有字段没数据。请问这是为什么?
    如果不写where 语句统计的结果是对的,没问题,但这样就不能选择日期了。也就是说我无法统计某一天的人数了。
      

  24.   

    我写的GetDate()只是举例说那利用你自己的时间过滤条件替换,你可以:

    Where 上网时间=GetDate() 
    替换成
    Where DateDiff(day,上网时间)=0
      

  25.   

    你的问题我见了 你可以根据需要加上各种条件和你的selec项  如
    select distinct 上网人,distinct DATEPART(hour,上网时间),count(*) from 表
    where 条件
    groupby  上网人,DATEPART(hour,上网时间)
      

  26.   

    to:9527(我靠,还是提交不上去!CSDN我服了你)
    不好意思,我是菜鸟,我不明白:
    因为你的日期含有小时、分的信息,拿它和天做比较当然不会被认为一致
    这句话的意思。
    譬如说我在EDIT中输入一个日期,然后我把字段 '日期'中与EDIT中输入的相同的
    数据统计出来,那我这样Where (日期='''+edit1.text+'''')
    写不可以吗? 
      

  27.   

    to:9527(我靠,还是提交不上去!CSDN我服了你)
    不好意思,我是菜鸟,我不明白:
    因为你的日期含有小时、分的信息,拿它和天做比较当然不会被认为一致
    这句话的意思。
    譬如说我在EDIT中输入一个日期,然后我把字段 '日期'中与EDIT中输入的相同的
    数据统计出来,那我这样Where (日期='''+edit1.text+'''')   (当然类型转换我会处理好,这里假设类型一致)
    写不可以吗? 
      

  28.   

    to:9527(我靠,还是提交不上去!CSDN我服了你)
    不好意思,我是菜鸟,我不明白:
    因为你的日期含有小时、分的信息,拿它和天做比较当然不会被认为一致
    这句话的意思。
    譬如说我在EDIT中输入一个日期,然后我把字段 '日期'中与EDIT中输入的相同的
    数据统计出来,那我这样Where (日期='''+edit1.text+'''')   (当然类型转换我会处理好,这里假设类型一致)
    写不可以吗?
      

  29.   

    to:9527(我靠,还是提交不上去!CSDN我服了你)
    昨天下午我就看到你的回话,可惜我5:00后一直提交不了呀,等了1小时还是不行,所以只好现在回了,不知道你还在不在。
    不好意思,我是菜鸟,我不明白:
    因为你的日期含有小时、分的信息,拿它和天做比较当然不会被认为一致
    这句话的意思。
    譬如说我在EDIT中输入一个日期,然后我把字段 '日期'中与EDIT中输入的相同的
    数据统计出来,那我这样Where (日期='''+edit1.text+'''')   (当然类型转换我会处理好,这里假设类型一致)
    写不可以吗?
      

  30.   

    你用
    Where DateDiff(day,上网时间,DateTime类型的输入日条件)=0就可以了
      

  31.   

    不行就用mail,太慢
    [email protected]
      

  32.   

    邮件已回,另外
    “因为你的日期含有小时、分的信息,拿它和天做比较当然不会被认为一致”是指因为你的“2002-1-1  7”含有小时的信息(看来他肯定是字符型的了)那么你用"="这个预算符和'2002-1-1'比较肯定是得不到相等的结果的。针对字符(char,varchar)型字段进行比较你可以采用
    Where Substring(上网时间,1,8)=过滤输入的8位日期,此外注意你这种日期的保存形式不利于进行比较,例如12月的时候需要Substring(上网时间,1,9),而又是10以后就要改成Substring(上网时间,1,10),这样很麻烦,我建议
    1、如果是DateTime类型保存上网时间,采用DateDiff方式
    2、如果char,varchar类型采用格式化保存上网时间例如YYYY-MM-DD HH:NN:SS的形式,或者采用Convert先转成DateTime类型结合DateDiff,例如:
    Where DateDiff(day,Convert(DateTime,上网时间),时间类型的输入查询日期)=0其余部分见附件
      

  33.   

    to: 9527(我靠,还是提交不上去!CSDN我服了你) 
    我现在调试就是在SQL查询器里调试的,我用你的
    Select * from 表
    Where DateDiff(day,'2002-1-1 10:30:00','2002-1-1')
    语句也查不出数据呀,系统提示)附近有语法错误,我找了半天也找不出来。