表结构是这样的:一个简单的考勤表 nameid     name     time
  1         小明      2008-10-01 15:41:25
  1         小明      2008-10-01 15:42:25
  1         小明      2008-10-01 15:31:25
  1         小明      2008-10-02 15:41:25
  1         小明      2008-10-02 15:42:25
  1         小明      2008-10-02 15:31:25
  2         小红      2008-10-01 15:31:25
  2         小红      2008-10-01 15:41:25
  2         小红      2008-10-01 15:41:25
现在是需要查出每个人的上下班时间,所以取每一天的按照时间先后顺序  取第一条和最后一条记录!
如:
1     小明     2008-10-01 15:31:25      2008-10-01 15:42:25
1     小明     2008-10-02 15:31:25      2008-10-02 15:42:25

解决方案 »

  1.   

    --> liangCK小梁 于2008-10-18
    --> 生成测试数据: #T
    IF OBJECT_ID('tempdb.dbo.#T') IS NOT NULL DROP TABLE #T
    CREATE TABLE #T (nameid INT,name VARCHAR(4),[time] DATETIME)
    INSERT INTO #T
    SELECT 1,'小明','2008-10-01 15:41:25' UNION ALL
    SELECT 1,'小明','2008-10-01 15:42:25' UNION ALL
    SELECT 1,'小明','2008-10-01 15:31:25' UNION ALL
    SELECT 1,'小明','2008-10-02 15:41:25' UNION ALL
    SELECT 1,'小明','2008-10-02 15:42:25' UNION ALL
    SELECT 1,'小明','2008-10-02 15:31:25' UNION ALL
    SELECT 2,'小红','2008-10-01 15:31:25' UNION ALL
    SELECT 2,'小红','2008-10-01 15:41:25' UNION ALL
    SELECT 2,'小红','2008-10-01 15:41:25'--SQL查询如下:SELECT name,
           MIN([time]) AS start_time,
           MAX([time]) AS end_time
    FROM #T
    GROUP BY name,CONVERT(VARCHAR(10),[time],120)/*
    name start_time              end_time
    ---- ----------------------- -----------------------
    小红   2008-10-01 15:31:25.000 2008-10-01 15:41:25.000
    小明   2008-10-01 15:31:25.000 2008-10-01 15:42:25.000
    小明   2008-10-02 15:31:25.000 2008-10-02 15:42:25.000(3 行受影响)*/
      

  2.   

    SELECT name,
           MIN([time]) AS start_time,
           MAX([time]) AS end_time
    FROM #T
    GROUP BY name,CONVERT(VARCHAR(10),[time],120)
      

  3.   

    IF OBJECT_ID('tempdb.dbo.#T') IS NOT NULL DROP TABLE #T
    CREATE TABLE #T (nameid INT,name VARCHAR(4),[time] DATETIME)
    INSERT INTO #T
    SELECT 1,'小明','2008-10-01 15:41:25' UNION ALL
    SELECT 1,'小明','2008-10-01 15:42:25' UNION ALL
    SELECT 1,'小明','2008-10-01 15:31:25' UNION ALL
    SELECT 1,'小明','2008-10-02 15:41:25' UNION ALL
    SELECT 1,'小明','2008-10-02 15:42:25' UNION ALL
    SELECT 1,'小明','2008-10-02 15:31:25' UNION ALL
    SELECT 2,'小红','2008-10-01 15:31:25' UNION ALL
    SELECT 2,'小红','2008-10-01 15:41:25' UNION ALL
    SELECT 2,'小红','2008-10-01 15:41:25'--SQL查询如下:SELECT nameid,name,
           MIN([time]) AS start_time,
           MAX([time]) AS end_time
    FROM #T
    GROUP BY 
    nameid,name,CONVERT(VARCHAR(10),[time],120)
    /*
    nameid      name start_time              end_time
    ----------- ---- ----------------------- -----------------------
    1           小明   2008-10-01 15:31:25.000 2008-10-01 15:42:25.000
    1           小明   2008-10-02 15:31:25.000 2008-10-02 15:42:25.000
    2           小红   2008-10-01 15:31:25.000 2008-10-01 15:41:25.000
    */
      

  4.   

    SELECT name,
           MIN([time]) AS start_time,
           MAX([time]) AS end_time
    FROM #T
    GROUP BY name,CONVERT(VARCHAR(10),[time],120)
      

  5.   

      
    select nameid ,name,上班=min(time),落班=max(time) from tb group by day(time),nameid ,name 
      

  6.   

    SELECT name,
           MIN([time]) AS start_time,
           MAX([time]) AS end_time
    FROM #T
    GROUP BY name,CONVERT(VARCHAR(10),[time],120)
      

  7.   

    楼上们写的都很正确,按nameid及日期分组,取最大、最小时间就是了。
    SELECT name,
           MIN([time]) AS start_time,
           MAX([time]) AS end_time
    FROM TABLENAME
    GROUP BY name,CONVERT(VARCHAR(10),[time],120)
      

  8.   

    --> --> (Andy)生成测试数据 2008-10-18
    Set Nocount On
    declare @1 table([nameid] int,[name] nvarchar(2),[time] Datetime)
    Insert @1
    select 1,N'小明','2008-10-01 15:41:25' union all
    select 1,N'小明','2008-10-01 15:42:25' union all
    select 1,N'小明','2008-10-01 15:31:25' union all
    select 1,N'小明','2008-10-02 15:41:25' union all
    select 1,N'小明','2008-10-02 15:42:25' union all
    select 1,N'小明','2008-10-02 15:31:25' union all
    select 2,N'小红','2008-10-01 15:31:25' union all
    select 2,N'小红','2008-10-01 15:41:25' union all
    select 2,N'小红','2008-10-01 15:41:25'
     
    Select nameid,name,Min(time),Max(time) 
    From @1 
    Group by nameid,name,convert(char(8),time,112) /*
    nameid      name                         
    ----------- ---- ----------------------- -----------------------
    1           小明   2008-10-01 15:31:25.000 2008-10-01 15:42:25.000
    1           小明   2008-10-02 15:31:25.000 2008-10-02 15:42:25.000
    2           小红   2008-10-01 15:31:25.000 2008-10-01 15:41:25.000
    */
      

  9.   

    select nameid,name,minx(time) as start,max(time) as end
    from table
    group by nameid,name,convert(varchar(10),getdate(),120)
      

  10.   

    SELECT nameid,name,
           MIN([time]) AS start_time,
           MAX([time]) AS end_time
    FROM #T
    GROUP BY 
        name,CONVERT(VARCHAR(10),[time],120)
    不难。
      

  11.   


    if object_Id('T')is not null
       drop table T
    go
    create table T(nameid int,name nvarchar(10),time datetime)
    insert into T select 1,'小明','2008-10-01 15:41:25'
        union all select 1,'小明','2008-10-01 15:42:25'
        union all select 1,'小明','2008-10-01 15:31:25'
        union all select 1,'小明','2008-10-02 15:41:25'
        union all select 1,'小明','2008-10-02 15:42:25'
        union all select 1,'小明','2008-10-02 15:31:25'
        union all select 2,'小红','2008-10-01 15:31:25'
        union all select 2,'小红','2008-10-01 15:41:25'
        union all select 2,'小红','2008-10-01 15:41:25'
    --------
    select name,min(time) start_time,max(time) end_time from t 
    group by name,convert(varchar(10),time,120)小红 2008-10-01 15:31:25.000 2008-10-01 15:41:25.000
    小明 2008-10-01 15:31:25.000 2008-10-01 15:42:25.000
    小明 2008-10-02 15:31:25.000 2008-10-02 15:42:25.000
      

  12.   

    我想继续问下大家,在用convert函数的时候,VERT (data_type[(length)], expression [, style])里面的数据类型的length和style里面的大小是如何确定的呢?
      

  13.   

    SELECT name,
           MIN([time]) AS start_time,
           MAX([time]) AS end_time
    FROM #T
    GROUP BY name,CONVERT(VARCHAR(10),[time],120)
      

  14.   

    select   1 nameid,N'小明' [name],'2008-10-01 15:41:25' [time] into #t union
    select   1,N'小明','2008-10-01 15:42:25' union
    select   1,N'小明','2008-10-01 15:31:25' union 
    select   1,N'小明','2008-10-02 15:41:25' union 
    select   1,N'小明','2008-10-02 15:42:25' union 
    select   1,N'小明','2008-10-02 15:31:25' union 
    select   2,N'小红','2008-10-01 15:31:25' union 
    select   2,N'小红','2008-10-01 15:41:25' union 
    select   2,N'小红','2008-10-01 15:41:25' 
    select * from #tselect *,
    (select max([time]) from #t  where [name]=t.[name] and datediff(day,[time],t.[time])=0 )
    from #t t 
    where [time]=(select min([time]) from #t  where [name]=t.[name] and datediff(day,[time],t.[time])=0 )
    drop table
      

  15.   

    SELECT name,
           MIN([time]) AS start_time,
           MAX([time]) AS end_time
    FROM TABLENAME
    GROUP BY name,CONVERT(VARCHAR(10),[time],120)
      

  16.   

    select nameid,name,min(time) As 上班,max(time) 下班,day(time)
    from table
    group by nameid,name,day(time)
      

  17.   

    SELECT name,
           MIN([time]) AS start_time,
           MAX([time]) AS end_time
    FROM TABLENAME
    GROUP BY name,CONVERT(VARCHAR(10),[time],120)
      

  18.   

    这个很清楚SELECT name,
           MIN([time]) AS start_time,
           MAX([time]) AS end_time
    FROM #T
    GROUP BY name,CONVERT(VARCHAR(10),[time],120)