一个求时间差的问题,要求得数为分钟例如 表t1id  f1      f2      f3
1   1:10    1:20    1:30
2   2:05    2:23    2:40
3   4:20    6:18    9:25
......用一条SQL语句进行查询 结果如下 id   f2-f1    f3-f2 
 1    10        10
 2    18        17
 3   118       277 

解决方案 »

  1.   

    -- 测试数据
    if object_id('tempdb.dbo.#') is not null drop table #
    create table #(id int, f1 datetime, f2 datetime, f3 datetime)
    insert into #
    select 1, '1:10', '1:20', '1:30' union all
    select 2, '2:05', '2:23', '2:40' union all
    select 3, '4:20', '6:18', '9:25'select id, [f2-f1] = datediff(minute,f1,f2), [f3-f2] = datediff(minute,f2,f3) from #/*
    id          f2-f1       f3-f2
    ----------- ----------- -----------
    1           10          10
    2           18          17
    3           118         187  (not 277)
    */
      

  2.   

    Datediff:返回跨两个日期的日期和时间边界数语法:Datediff(datepart,startdate,enddate)参数
    datepart是规定了应在日期的哪一部分计算差额的参数。下表列出了 Microsoft® SQL Server™ 识别的日期部分和缩写。日期部分 缩写 
    year yy, yyyy 
    quarter qq, q 
    Month mm, m 
    dayofyear dy, y 
    Day dd, d 
    Week wk, ww 
    Hour hh 
    minute mi, n 
    second ss, s 
    millisecond ms 
    startdate是计算的开始日期。startdate 是返回 datetime 或 smalldatetime 值或日期格式字符串的表达式。 因为 smalldatetime 只精确到分钟,所以当用 smalldatetime 值时,秒和毫秒总是 0。如果您只指定年份的最后两位数字,则小于或等于"两位数年份截止期"配置选项的值的最后两位数字的数字所在世纪与截止年所在世纪相同。大于该选项的值的最后两位数字的数字所在世纪为截止年所在世纪的前一个世纪。例如,如果 two digit year cutoff 为 2049(默认),则 49 被解释为 2049,2050 被解释为 1950。为避免模糊,请使用四位数的年份。enddate是计算的终止日期。enddate 是返回 datetime 或 smalldatetime 值或日期格式字符串的表达式。返回类型
    integer注释
    startdate 是从 enddate 减去。如果 startdate 比 enddate 晚,返回负值。当结果超出整数值范围,DATEDIFF 产生错误。对于毫秒,最大数是 24 天 20 小时 31 分钟零 23.647 秒。对于秒,最大数是 68 年。计算跨分钟、秒和毫秒这些边界的方法,使得 DATEDIFF 给出的结果在全部数据类型中是一致的。结果是带正负号的整数值,其等于跨第一个和第二个日期间的 datepart 边界数。例如,在 1 月 4 日(星期日)和 1 月 11 日(星期日)之间的星期数是 1。示例
    此示例确定在 pubs 数据库中标题发布日期和当前日期间的天数。USE pubsGOSELECT DATEDIFF(day, pubdate, getdate()) AS no_of_daysFROM titlesGO
    DATEDIFF函数在Access和MSSQL中的使用区别ACCESS中用法:DATEDIFF('day', pubdate, Now()) MSSQL中用法:DATEDIFF(day, pubdate, getdate())  
      

  3.   

    select id, [f2-f1] = datediff(minute,f1,f2), [f3-f2] = datediff(minute,f2,f3) from #
      

  4.   

    Datediff:返回跨两个日期的日期和时间边界数 语法:Datediff(datepart,startdate,enddate) 参数 
    datepart 是规定了应在日期的哪一部分计算差额的参数。下表列出了 Microsoft® SQL Server™ 识别的日期部分和缩写。 日期部分 缩写 
    year yy, yyyy 
    quarter qq, q 
    Month mm, m 
    dayofyear dy, y 
    Day dd, d 
    Week wk, ww 
    Hour hh 
    minute mi, n 
    second ss, s 
    millisecond ms 
      

  5.   

    select id, [f2-f1] = datediff(minute,f1,f2), [f3-f2] = datediff(minute,f2,f3) from t1 
    需要重点看看datediff语法!
      

  6.   

    if object_id('tb') is not null
       drop table tb
    go
    create table tb(id int,f1 datetime,f2 datetime,f3 datetime)
    go
    insert into tb
    select 1,'1:10','1:20','1:30' union all
    select 1,'2:05','2:23','2:40' union all
    select 1,'4:20','6:18','9:25' 
    go
    select id,datediff(mi,f1,f2),datediff(mi,f2,f3) from tb
      

  7.   

    看你的字段类型了
    是DATETIME类型的用DATEDIFF函数如果是字符型的先用CONVERT(DATETIME,字段)或CAST(字段 AS DATETIME)转成时间类型的再用DATEDIFF函数求时间差
    DATETIME函数楼上的几位都说的很清楚了
      

  8.   

    --> 测试数据: @s
    declare @s table (id int,f1 datetime,f2 datetime,f3 datetime)
    insert into @s
    select 1,'1:10','1:20','1:30' union all
    select 2,'2:05','2:23','2:40' union all
    select 3,'4:20','6:18','9:25'select id,[f2-f1]=datediff(mi,f1,f2),[f3-f2]=datediff(mi,f2,f3) from @s
      

  9.   

    --或简写
    datediff(mi,starttime,endtime)
      

  10.   

    谢谢各位大哥给的回答,但是小弟用的是ACCESS
    所以这里说明一下ACCESS中的参数不同DateDiff 函数
    返回 Variant (Long) 值,该值指定两个指定日期之间的时间间隔数。
    语法
    DateDiff(interval, date1, date2[, firstdayofweek[, firstweekofyear]])
    DateDiff 函数语法具有下列这些命名参数:
    部分 说明 
    interval 必选。字符串表达式,是用于计算 date1 和 date2 之间差异的时间间隔。 
    date1, date2 必选;Variant (Date)。要在计算过程中使用的两个日期。 
    firstdayofweek 可选。指定一周的第一天的常量。如果未指定,将假设为星期日。 
    firstweekofyear 可选。指定一年的第一周的常量。如果未指定,那么第一周将假设为 1 月 1 日所在的周。
    设置
    interval 参数具有下列这些设置:
    设置 说明 
    yyyy 年 
    q 季 
    m 月 
    y 一年中的日期 
    d 日 
    w 工作日 
    ww 周 
    h 时 
    n 分 
    s 秒 
    firstdayofweek 参数具有下列这些设置:
    常量 值 说明 
    vbUseSystem 0 使用 NLS API 设置。 
    vbSunday 1 星期日(默认值) 
    vbMonday 2 星期一 
    vbTuesday 3 星期二 
    vbWednesday 4 星期三 
    vbThursday 5 星期四 
    vbFriday 6 星期五 
    vbSaturday 7 星期六 常量 值 说明 
    vbUseSystem 0 使用 NLS API 设置。 
    vbFirstJan1 1 由 1 月 1 日所在的周开始(默认值)。 
    vbFirstFourDays 2 由在新的一年中至少有四天的第一周开始。 
    vbFirstFullWeek 3 由一年中的第一个完整周开始。 
    说明
    可以使用 DateDiff 函数确定在两个日期之间存在多少个指定的时间间隔。例如,可以使用 DateDiff 计算两个日期之间的天数,或今天与一年的最后一天之间的周数。若要计算 date1 与 date2 之间的天数,可以使用一年中的日期(“y”)或日(“d”)。当 interval 是工作日(“w”)时,DateDiff 将返回两个日期之间的周数。如果 date1 为星期一,那么 DateDiff 将对 date2 之前的星期一数进行计数。它会对 date2 进行计数,但不包含 date1。然而如果 interval 是周(“ww”),那么 DateDiff 函数将返回两个日期之间的日历周数。它对 date1 与 date2 之间的星期日数进行计数。如果 date2 是星期日,那么 DateDiff 将对其进行计数;但它不会对 date1 进行计数(即使它是星期日)。如果 date1 所指的时间点比 date2 晚,那么 DateDiff 函数将返回一个负数。firstdayofweek 参数将影响使用“w”和“ww”间隔符号的计算。如果 date1 或 date2 是日期文字,那么指定年将成为该日期的固定部分。然而,如果 date1 或 date2 由双引号 (" ") 引起来,并且您省略了年,那么在每次计算 date1 或 date2 表达式时,会将当前年插入到代码中。这样,就能编写出可在其他年份使用的代码。比较 12 月 31 日和次年的 1 月 1 日时,用于年(“yyyy”)的 DateDiff 将返回 1,尽管只经过了一天。注释   对于 date1 和 date2,如果 Calendar 属性设置为公历,那么所提供的日期必须是公历。如果 Calendar 是回历,那么所提供的日期必须是回历。
    非常感谢大家的支持,贫道这里稽首了:-)