有个开始时间和结束时间,在使用DATEDIFF函数计算后得到的是秒,如何能够将它转换为这样的格式:hh:mm:ss呢?

解决方案 »

  1.   

    Declare @Time1 DateTime, @Time2 DateTime
    Select @Time1 = '2007-06-26 18:00:01',@Time2 = '2007-06-26 21:22:08'
    Select Right(100 + DateDiff(hh, @Time1, @Time2), 2) + ':' + Right(100 + DateDiff(mi, @Time1, @Time2) % 60, 2) + ':' + Right(100 + DateDiff(ss, @Time1, @Time2) % 60, 2) 
    --Result
    /*
    03:22:07
    */
      

  2.   

    CREATE FUNCTION [dbo].[ss] (@a int)  
    RETURNS nvarchar(50) AS  
    BEGIN 
    declare @h nvarchar(10)
    declare @m nvarchar(10)
    declare @s nvarchar(10)
    select @h='00'+Convert(nvarchar(2),@a/3600),@m='00'+Convert(nvarchar(2),@a/60),@s='00'+Convert(nvarchar(2),@a%60)
     return  right(@h,2)+':'+right(@m,2)+':'+ right(@s,2)
    ENDselect dbo.ss(122)
                                                       
    -------------------------------------------------- 
    00:02:02(1 row(s) affected)
      

  3.   

    declare @s_datetime datetime,@e_datetime datetime,@TIME VARCHAR(100)
    declare @TOTAL_S int ,@H INT ,@M INT,@S INT
    SET @TOTAL_S=0
    SET @H=0
    SET @M=0
    SET @S=0
    set @s_datetime='2007-06-25 18:02:36'
    set @e_datetime='2007-06-26 18:02:39'
    select @TOTAL_S=datediff(ss,@s_datetime,@e_datetime)if @TOTAL_S>3600 
    BEGIN
    SET @H=(@TOTAL_S-(@TOTAL_S%3600))/3600
    SET @time=isnull(@time,'')+cast(@H AS VARCHAR(10))
    SET @TOTAL_S=@TOTAL_S%3600
    END
    ELSE
    SET @time=isnull(@time,'')+'00'IF @TOTAL_S>60
    BEGIN
    SET @M=(@TOTAL_S-(@TOTAL_S%60))/60
    SET @time=isnull(@time,'')+':'+cast(@M AS VARCHAR(10))
    SET @TOTAL_S=@TOTAL_S%60
    END
    ELSE
    SET @time=isnull(@time,'')+':00'IF @TOTAL_S>0
    IF @TOTAL_S>10
    BEGIN
    SET @S=@TOTAL_S
    SET @time=isnull(@time,'')+':'+cast(@S AS VARCHAR(10))
    END
    ELSE
    BEGIN
    SET @S=@TOTAL_S
    SET @time=isnull(@time,'')+':0'+cast(@S AS VARCHAR(10))
    END
    ELSE
    SET @time=isnull(@time,'')+':00'PRINT @TIME
      

  4.   

    想问一下paoluo您
    Select Right(100 + DateDiff(hh, @Time1, @Time2), 2)--为什么要加上'100'
      

  5.   

    paoluo大哥比较忙,我帮回答一下,
    Select Right(100 + DateDiff(hh, @Time1, @Time2), 2)--为什么要加上'100'
    为了取得的数字都是两位的,就是如果是1 ,会取出01
      

  6.   

    现在有这样的存储过程:在临界点的历时(lishi)字段应该显示为”hh-mm-ss”的格式,而不是”ss”的格式,而实际上在三个临界点显示的是”ss”的格式!
    --4.INSE_RECORD
    CREATE                 PROC INSE_RECORD
       @DATE DATETIME,    --日期
       @BC   int          --班次
    AS
       DECLARE @LL_TIME DATETIME
       DECLARE @QSK_ID  CHAR(17)
       DECLARE @YH_NAME VARCHAR(20)
       DECLARE @NUMBER  CHAR(7)
       DECLARE SELEMAX CURSOR FOR
       SELECT MAX(LL_TIME) AS MAXTIME,QSK_ID,YH_NAME,Number
       FROM GDW_LL_TJB
       WHERE STOP='1' AND ZUIXINBIAOSHI='0'
       GROUP BY QSK_ID,YH_NAME,Number
       OPEN SELEMAX
       FETCH NEXT FROM SELEMAX
       INTO @LL_TIME,@QSK_ID,@YH_NAME,@NUMBER
       WHILE @@FETCH_STATUS=0
       BEGIN
         declare @lishi int
         declare @liuliang float
         declare @shuiwei  float
         select @liuliang=liuliang,@shuiwei=shuiwei 
         from gdw_ll_tjb
         where qsk_id=@QSK_ID and ll_time=@LL_TIME and yh_name=@YH_NAME and number=@NUMBER
         if @BC=0  --早班
         BEGIN
            --插入并更新7:59:59      
            INSERT GDW_LL_TJB(QSK_ID,LL_TIME,YH_NAME,Number,LIULIANG,LR_TIME,STOP,ZUIXINBIAOSHI,SHUIWEI)
            VALUES (@QSK_ID,@DATE+'07:59:59',@YH_NAME,@NUMBER,0,CONVERT(VARCHAR(11),@DATE,120),1,0,@shuiwei)
            select @lishi=DATEDIFF(second,@LL_TIME,@DATE+' 08:00:00') 
            UPDATE GDW_LL_TJB
            SET LIULIANG=@liuliang,LiShi=@lishi,shuiliang=@lishi*@liuliang
            WHERE qsk_id=@QSK_ID and ll_time=@DATE+'07:59:59' and yh_name=@YH_NAME and number=@NUMBER
              --插入8:00:00
            INSERT GDW_LL_TJB(QSK_ID,LL_TIME,YH_NAME,Number,LIULIANG,LR_TIME,STOP,ZUIXINBIAOSHI,SHUIWEI)
            VALUES (@QSK_ID,@DATE+'08:00:00',@YH_NAME,@NUMBER,@liuliang,CONVERT(VARCHAR(11),@DATE,120),1,0,@shuiwei)     
         END
         IF @BC=1   --中班
         BEGIN
            --插入并更新15:59:59      
            INSERT GDW_LL_TJB(QSK_ID,LL_TIME,YH_NAME,Number,LIULIANG,LR_TIME,STOP,ZUIXINBIAOSHI,SHUIWEI)
            VALUES (@QSK_ID,@DATE+'15:59:59',@YH_NAME,@NUMBER,0,CONVERT(VARCHAR(11),@DATE,120),1,0,@shuiwei)
            select @lishi=DATEDIFF(second,@LL_TIME,@DATE+' 16:00:00') 
            UPDATE GDW_LL_TJB
            SET LIULIANG=@liuliang,LiShi=@lishi,shuiliang=@lishi*@liuliang
            WHERE qsk_id=@QSK_ID and ll_time=@DATE+'15:59:59' and yh_name=@YH_NAME and number=@NUMBER
            --插入8:00:00
            INSERT GDW_LL_TJB(QSK_ID,LL_TIME,YH_NAME,Number,LIULIANG,LR_TIME,STOP,ZUIXINBIAOSHI,SHUIWEI)
            VALUES (@QSK_ID,@DATE+'16:00:00',@YH_NAME,@NUMBER,@liuliang,CONVERT(VARCHAR(11),@DATE,120),1,0,@shuiwei)
         END
         IF @BC=2   --午班
         BEGIN
            --插入并更新7:59:59      
            INSERT GDW_LL_TJB(QSK_ID,LL_TIME,YH_NAME,Number,LIULIANG,LR_TIME,STOP,ZUIXINBIAOSHI,SHUIWEI)
            VALUES (@QSK_ID,@DATE+'23:59:59',@YH_NAME,@NUMBER,0,CONVERT(VARCHAR(11),@DATE,120),1,0,@shuiwei)
            select @lishi=DATEDIFF(second,@LL_TIME,DATEADD(DAY,1,@DATE)+' 0:00:00') 
            UPDATE GDW_LL_TJB
            SET LIULIANG=@liuliang,LiShi=@lishi,shuiliang=@lishi*@liuliang
            WHERE qsk_id=@QSK_ID and ll_time=@DATE+'23:59:59' and yh_name=@YH_NAME and number=@NUMBER
             --插入8:00:00
            INSERT GDW_LL_TJB(QSK_ID,LL_TIME,YH_NAME,Number,LIULIANG,LR_TIME,STOP,ZUIXINBIAOSHI,SHUIWEI)
            VALUES (@QSK_ID,DATEADD(DAY,1,@DATE)+' 0:00:00',@YH_NAME,@NUMBER,@liuliang,CONVERT(VARCHAR(11),@DATE,120),1,0,@shuiwei)
         END
         FETCH NEXT FROM SELEMAX
         INTO @LL_TIME,@QSK_ID,@YH_NAME,@NUMBER
       END
       CLOSE SELEMAX
       DEALLOCATE SELEMAX 
    GO
      

  7.   

    想问一下paoluo您,第三个Right(100 + DateDiff(ss, @Time1, @Time2) % 60, 2)是不是应该%3600呀!
      

  8.   

    现在有这样的存储过程:在临界点的历时(lishi)字段应该显示为”hh-mm-ss”的格式,而不是”ss”的格式,而实际上在三个临界点显示的是”ss”的格式!-------
    沒看懂。想问一下paoluo您,第三个Right(100 + DateDiff(ss, @Time1, @Time2) % 60, 2)是不是应该%3600呀!
    -----------
    應該是60,樓主再想想看。
      

  9.   

    在临界点的历时(lishi)字段应该显示为”hh-mm-ss”的格式,而不是”ss”的格式,而实际上在三个临界点显示的是”ss”的格式!比如15:59:59时候的lishi现实的格式为ss就是秒,现在想显示hh:mm:ss的格式!
    如果不清楚,QQ:785277368
      

  10.   

    try
    select @lishi=DATEDIFF(second,@LL_TIME,@DATE+' 08:00:00')改為Select @lishi = Right(100 + DateDiff(hh, @LL_TIME, @DATE+' 08:00:00'), 2) + ':' + Right(100 + DateDiff(mi, @LL_TIME, @DATE+' 08:00:00') % 60, 2) + ':' + Right(100 + DateDiff(ss, @LL_TIME, @DATE+' 08:00:00') % 60, 2) 下面的做類似修改
    另外,GDW_LL_TJB中的LiShi必須是字符型。