你这种情况,单个SQL很难实现,建议采用临时表的方式,先把数据通过计算准备好,然后在用。

解决方案 »

  1.   

    呵呵, reallike的想象力真是丰富呀,我写的9527,就是 blazingfire这样的
    用户的登陆名!
      

  2.   

    请你注意一点:
      with query1 do
      begin
        close;
        sql.clear;
        sql.add('Select 上网时间分段,Count(用户名) as 上网人数');
        sql.add('from');
        sql.add('(');
        sql.add('Select Distinct 用户名,上网时间分段=DatePart(Hour,上网时间)');
        sql.add('from');
        sql.add('上网记录表');
        sql.add('Where DateDiff(day,上网时间,:DateLimit)=0');
        sql.add(') T');
        sql.add('Group By 上网时间分段');
        ParamByName('DateLimit').AsDateTime:=StrToDate(Edit1.Text);
    在这段语句中,出现时间相关的函数有两个
    1、上网时间分段=DatePart(Hour,上网时间)
    2、DateDiff(day,上网时间,:DateLimit)=0其中1是“只要一个人在当月上过网,人数就位1,多次上网不累加。”的过滤条件,例如当要求“一个小时内上网不重复累计”,就可以“上网时间分段=DatePart(Hour,上网时间)”,当要求“一天内上网不重复累计”就可以“上网时间分段=DatePart(day,上网时间)”,同样要求“一月上网,不重复累计”就可以“上网时间分段=DatePart(month,上网时间)”其实这个嵌套的SQL语句就是起了一个临时表的作用。对于2的解释是“统计一天或者一个月的人数”,在你要统计一天的上网情况时,你可以“DateDiff(day,上网时间,:DateLimit)=0”,当你统计一月的上网情况,你可以DateDiff(month,上网时间,:DateLimit)=0,这里当然也可以采用更灵活的时间段限制,例如8月4号到8月12号,就可以改成“where 上网时间 Between :startDateLimit And :endDateLimit”(注意这种写法DateLimit最好精确到秒)或者直接写成“where (上网时间 >= :startDateLimit) And (上网时间<=:endDateLimit)”
    分清楚这两个时间条件的用途,就可以很灵活的任意查询了
    另外如reallike(爱翔) 所说,9527的典故确实从哪儿来,当时取的是“蹦蹦跳跳像条狗,被人打不许汪汪叫”(大家还记得仆人们的队歌吧)之意,呵呵。
      

  3.   

    我用
    with query1 do
      begin
        close;
        sql.clear;
        sql.add('Select 上网时间分段,Count(用户名) as 上网人数');
        sql.add('from');
        sql.add('(');
        sql.add('Select Distinct 用户名,上网时间分段=DatePart(day,上网时间)');////////就这里就改了一下
        sql.add('from');
        sql.add('上网记录表');
        sql.add('Where DateDiff(day,上网时间,:DateLimit)=0');
        sql.add(') T');
        sql.add('Group By 上网时间分段');
        ParamByName('DateLimit').AsDateTime:=StrToDate(Edit1.Text);
     在EDIT1中输入2002-1,统计2002-1月的数据就出错,不知道,是不是日期类型的一定要将天数也写上呀。  9527的典故我也知道,看过星爷的唐伯虎点秋香,只是我以为取9527可能是另外一个原因,应为大学里,如果是95届的通常会以95XX作为班级号,所以我一直认为9527是由于95届的原因。
      

  4.   

    邮件我看了,按那个方法我输入2002-01应为有后缀01
    所以我试了一下就只能统计后缀那天的人数了,无法统计2002年1月的人数,我希望的是这样的表,在EDIT1中输入2002-01那么统计那个月的人数
    上网日期  人数
    1          4
    2          1
    3          .
    4          .
    5
    .          .
    .
    .
    31         ..
    详细的见邮件吧,我又发了一封。  94届的不算老吧,我是97的,也就比我大3年,现在我觉得公司就喜欢招有4,5年工作经验的人。