一个求时间差的问题,要求得数为分钟
前提条件:按照时间F4进行排序后进行计算例如 表t1 id  f1      f2      f3     f4
1  1:10    1:20    1:30    2008-1-3
2  4:20    6:18    9:25    2008-1-4
3  2:05    2:23    2:40    2008-1-5
...... 用一条SQL语句进行查询 结果如下 id  f4         f2-f1    f3-f2 
1   2008-1-3    10        10 
3   2008-1-4    18        17 
2   2008-1-5   118       187
这个问题上次解决过,但是我没有注意到时间排序的问题,运行时候出现了负数的出现,所以这次提上来,请高手帮忙,谢谢,非常感谢 

解决方案 »

  1.   

    第二行的ID=3 而且 F2=2:23 F1=2:05 所以 F2-F1=17分钟对不起,有个错误 ,对于原来的表中F4字段id  f1      f2      f3    f4 
    1  1:10    1:20    1:30    2008-1-3 
    2  4:20    6:18    9:25    2008-1-5 
    3  2:05    2:23    2:40    2008-1-4 
    ...... 
      

  2.   


    declare @t1 table
    (
    id int identity(1,1),
    f1 time,
    f2 time,
    f3 time,
    f4 date
    )insert @t1 select '1:10','1:20','1:30','2008-1-3'
    union all select '4:20','6:18','9:25','2008-1-5'
    union all select '2:05','2:23','2:40','2008-1-4'select
    id,
    f4,
    [f2-f1] = datediff(minute,convert(varchar(10),f4,120) + ' ' + convert(varchar(10),f1,120)
    ,convert(varchar(10),f4,120) + ' ' + convert(varchar(10),f2,120)),
    [f3-f2] = datediff(minute,convert(varchar(10),f4,120) + ' ' + convert(varchar(10),f2,120)
    ,convert(varchar(10),f4,120) + ' ' + convert(varchar(10),f3,120))
    from @t1
    order by f4和你的F4排序不排序无关啊,因为你的想减是同一行的,只要你保证你减数,大于被减数,就不会是负数
      

  3.   

    如果你不确定F2,F1是谁大,但有需要得到一个正数的差,那你就取绝对值好了如:select
    id,
    f4,
    [f2-f1] = abs(datediff(minute,convert(varchar(10),f4,120) + ' ' + convert(varchar(10),f2,120)
    ,convert(varchar(10),f4,120) + ' ' + convert(varchar(10),f1,120))),
    [f3-f2] = abs(datediff(minute,convert(varchar(10),f4,120) + ' ' + convert(varchar(10),f3,120)
    ,convert(varchar(10),f4,120) + ' ' + convert(varchar(10),f2,120)))
    from @t1
    order by f4
      

  4.   

    declare @t table(id int,f1 varchar(10),
    f2 varchar(10),f3 varchar(10),f4 datetime
    )
    insert into @t select
    1,  '1:10',    '1:20'   , '1:30',    '2008-1-3'
    union all select
    2,  '4:20' ,   '6:18'  ,  '9:25' ,   '2008-1-5'
    union all select
    3,  '2:05'  ,  '2:23' ,   '2:40'  ,  '2008-1-4'select id,DATEDIFF(mi,f4+' '+f1,f4+' '+f2) as [f2-f1],
    DATEDIFF (mi,f4+' '+f2,f4+' '+f3) as [f3-f2],
    f4 
    from @t
    order by f4
      

  5.   

    不好意思哈,你把我的定义字段date和time,都改成datetime
      

  6.   


    CREATE TABLE t1(id INT, f1 VARCHAR(10),f2 VARCHAR(10),f3 VARCHAR(10),f4 VARCHAR(10))
    GO
    INSERT t1 SELECT 1  ,'1:10',    '1:20'  ,  '1:30'  ,  '2008-1-3' 
    UNION ALL SELECT 2 , '4:20' ,   '6:18' ,   '9:25' ,   '2008-1-5' 
    UNION ALL SELECT 3,  '2:05'  ,  '2:23',    '2:40',    '2008-1-4'
    GOSELECT id,f4, 
    [f2-f1]=DATEDIFF(mi, f4 + ' ' + f1 + ':00.000',f4 + ' ' + f2 + ':00.000'),
    [f3-f2]=DATEDIFF(mi, f4 + ' ' + f2 + ':00.000',f4 + ' ' + f3 + ':00.000')
     FROM t1
    GO
    /*
    1 2008-1-3 10 10
    2 2008-1-5 118 187
    3 2008-1-4 18 17*/DROP TABLE t1
    GO 
      

  7.   

    我的浏览器有问题,
    每次都要手工敲 code=SQL 还有 /code]
    郁闷
      

  8.   


    DECLARE @t TABLE(id INT,f1 NVARCHAR(5),f2 NVARCHAR(5),f3 NVARCHAR(5),f4 DATETIME)
    INSERT INTO @t
    SELECT 1,'1:10','1:20','1:30','2008-1-3 ' UNION ALL
    SELECT 2,'4:20','6:18','9:25',' 2008-1-4  ' UNION ALL
    SELECT 3,'2:05','2:23','2:40',' 2008-1-5  'SELECT id,f4,(LEFT(f2,LEN(f2)-3)*60+RIGHT(f2,2))-(LEFT(f1,LEN(f1)-3)*60+RIGHT(f1,2))AS 'f2-f1',
                 (LEFT(f3,LEN(f3)-3)*60+RIGHT(f3,2))-(LEFT(f2,LEN(f2)-3)*60+RIGHT(f2,2))AS 'f3-f2'
    FROM @t
    ORDER BY f4(3 row(s) affected)id          f4                                                     f2-f1       f3-f2       
    ----------- ------------------------------------------------------ ----------- ----------- 
    1           2008-01-03 00:00:00.000                                10          10
    2           2008-01-04 00:00:00.000                                118         187
    3           2008-01-05 00:00:00.000                                18          17(3 row(s) affected)
      

  9.   

    CREATE TABLE tb(id INT, f1 VARCHAR(10),f2 VARCHAR(10),f3 VARCHAR(10),f4 VARCHAR(10))
    INSERT tb SELECT 1 , '1:10' , '1:20' , '1:30' , '2008-1-3' 
    UNION ALL SELECT 2 , '4:20' , '6:18' , '9:25' , '2008-1-5' 
    UNION ALL SELECT 3 , '2:05' , '2:23' , '2:40' , '2008-1-4'
    GOselect id , f4,
           'f2-f1' = datediff(mi,cast(f4+' '+f1+':00' as datetime),cast(f4+' '+f2+':00' as datetime)),
           'f3-f2' = datediff(mi,cast(f4+' '+f2+':00' as datetime),cast(f4+' '+f3+':00' as datetime))
    from tbdrop table tb/*
    id          f4         f2-f1       f3-f2       
    ----------- ---------- ----------- ----------- 
    1           2008-1-3   10          10
    2           2008-1-5   118         187
    3           2008-1-4   18          17(所影响的行数为 3 行)
    */
      

  10.   


    declare @t table(id int,f1 varchar(10),f2 varchar(10),f3 varchar(10),f4 varchar(10)) 
    insert @t select 1,  '1:10',    '1:20',    '1:30' ,   '2008-1-3' 
    insert @t select 2,  '4:20',    '6:18',    '9:25' ,   '2008-1-5' 
    insert @t select 3,  '2:05',    '2:23',    '2:40' ,   '2008-1-4'
    --select id,f4,datediff(f4+' '+f2) 
    select ID,F4,
           datediff(mi,convert( varchar(20),f4+' '+f1,120),convert( varchar(20),f4+' '+f2,120))[F2-F1],
           datediff(mi,convert( varchar(20),f4+' '+f2,120),convert( varchar(20),f4+' '+f3,120))[F3-F2]
     from @tID          F4         F2-F1       F3-F2       
    ----------- ---------- ----------- ----------- 
    1           2008-1-3   10          10
    2           2008-1-5   118         187
    3           2008-1-4   18          17(所影响的行数为 3 行)
      

  11.   


    declare @t1 table
    (
    id int identity(1,1),
    f1 time,
    f2 time,
    f3 time,
    f4 date
    )insert @t1 select '1:10','1:20','1:30','2008-1-3'
    union all select '4:20','6:18','9:25','2008-1-5'
    union all select '2:05','2:23','2:40','2008-1-4'select
    id,
    f4,
    [f2-f1] = datediff(minute,f1,f2),
    [f3-f2] = datediff(minute,f2,f3)
    from @t1
    order by f4楼下的谁帮测试一下,2005和2000下,如果时间字段定义成DATETIME,直接DATEDIFF是什么结果。
    刚测试了一下,才发现2008处理这个挺简单