簡體   English   中英

DateDiff 到 output 小時和分鍾

[英]DateDiff to output hours and minutes

我的代碼以小時為單位給出了 TOTAL HOURS,但我正在嘗試 output 之類的

TotalHours 
  8:36

其中 8 代表小時部分,36 代表分鍾部分,表示一個人一天在辦公室工作的總小時數。

with times as (
SELECT    t1.EmplID
        , t3.EmplName
        , min(t1.RecTime) AS InTime
        , max(t2.RecTime) AS [TimeOut]
        , t1.RecDate AS [DateVisited]
FROM  AtdRecord t1 
INNER JOIN 
      AtdRecord t2 
ON    t1.EmplID = t2.EmplID 
AND   t1.RecDate = t2.RecDate
AND   t1.RecTime < t2.RecTime
inner join 
      HrEmployee t3 
ON    t3.EmplID = t1.EmplID 
group by 
          t1.EmplID
        , t3.EmplName
        , t1.RecDate
)
SELECT    EmplID
        , EmplName
        , InTime
        , [TimeOut]
        , [DateVisited]
        , DATEDIFF(Hour,InTime, [TimeOut]) TotalHours
from times
Order By EmplID, DateVisited 

很簡單:

CONVERT(TIME,Date2 - Date1)

例如:

Declare @Date2 DATETIME = '2016-01-01 10:01:10.022'
Declare @Date1 DATETIME = '2016-01-01 10:00:00.000'
Select CONVERT(TIME,@Date2 - @Date1) as ElapsedTime

產量:

ElapsedTime
----------------
00:01:10.0233333

(1 row(s) affected)

試試這個查詢

select
    *,
    Days          = datediff(dd,0,DateDif),
    Hours         = datepart(hour,DateDif),
    Minutes       = datepart(minute,DateDif),
    Seconds       = datepart(second,DateDif),
    MS            = datepart(ms,DateDif)
from
    (select
         DateDif = EndDate-StartDate,
         aa.*
     from
         (  -- Test Data
          Select
              StartDate = convert(datetime,'20090213 02:44:37.923'),
              EndDate   = convert(datetime,'20090715 13:24:45.837')) aa
    ) a

輸出

DateDif                  StartDate                EndDate                 Days Hours Minutes Seconds MS
-----------------------  -----------------------  ----------------------- ---- ----- ------- ------- ---
1900-06-02 10:40:07.913  2009-02-13 02:44:37.923  2009-07-15 13:24:45.837 152  10    40      7       913

(1 row(s) affected)

可以做這樣的小改動

  SELECT  EmplID
        , EmplName
        , InTime
        , [TimeOut]
        , [DateVisited]
        , CASE WHEN minpart=0 
        THEN CAST(hourpart as nvarchar(200))+':00' 
        ELSE CAST((hourpart-1) as nvarchar(200))+':'+ CAST(minpart as nvarchar(200))END as 'total time'
        FROM 
        (
        SELECT   EmplID, EmplName, InTime, [TimeOut], [DateVisited],
        DATEDIFF(Hour,InTime, [TimeOut]) as hourpart, 
        DATEDIFF(minute,InTime, [TimeOut])%60 as minpart  
        from times) source

我會將您的最終選擇設為:

SELECT    EmplID
        , EmplName
        , InTime
        , [TimeOut]
        , [DateVisited]
        , CONVERT(varchar(3),DATEDIFF(minute,InTime, TimeOut)/60) + ':' +
          RIGHT('0' + CONVERT(varchar(2),DATEDIFF(minute,InTime,TimeOut)%60),2)
          as TotalHours
from times
Order By EmplID, DateVisited 

任何嘗試使用DATEDIFF(hour,...的解決方案都會很復雜(如果它是正確的),因為DATEDIFF計算轉換 - DATEDIFF(hour,...09:59',...10:01')將返回 1因為從 9 點到 10 點的時間轉換。所以我只是在分鍾上使用DATEDIFF

如果涉及秒數,上述內容仍然可能存在細微錯誤(它可能會稍微多計,因為它的計數分鍾轉換)所以如果您需要秒或毫秒精度,您需要調整DATEDIFF以使用這些單位,然后應用合適的除法常數(根據上一小時)只返回小時和分鍾。

只需更改

DATEDIFF(Hour,InTime, [TimeOut]) TotalHours

部分到

CONCAT((DATEDIFF(Minute,InTime,[TimeOut])/60),':',
       (DATEDIFF(Minute,InTime,[TimeOut])%60)) TotalHours 

/60 給你小時,%60 給你剩余的分鍾,而 CONCAT 讓你在它們之間加上一個冒號。

我知道這是一個老問題,但我遇到了它,並認為如果其他人遇到它可能會有所幫助。

將 MS 中的Datediff除以一天中的毫秒數,轉換為Datetime ,然后轉換為時間:

Declare @D1 datetime = '2015-10-21 14:06:22.780', @D2 datetime = '2015-10-21 14:16:16.893'

Select  Convert(time,Convert(Datetime, Datediff(ms,@d1, @d2) / 86400000.0))

如果你想要 08:30 ( HH:MM) 格式然后試試這個,

SELECT EmplID
    , EmplName
    , InTime
    , [TimeOut]
    , [DateVisited]
    ,  RIGHT('0' + CONVERT(varchar(3),DATEDIFF(minute,InTime, TimeOut)/60),2) + ':' +
      RIGHT('0' + CONVERT(varchar(2),DATEDIFF(minute,InTime,TimeOut)%60),2)
      as TotalHours from times Order By EmplID, DateVisited

請輸入您的相關值並嘗試以下操作:

declare @x int, @y varchar(200),
        @dt1 smalldatetime = '2014-01-21 10:00:00', 
        @dt2 smalldatetime = getdate()

set @x = datediff (HOUR, @dt1, @dt2)
set @y =  @x * 60 -  DATEDIFF(minute,@dt1, @dt2)
set @y = cast(@x as varchar(200)) + ':' + @y
Select @y

[hh:mm:ss] 中的兩個時間差

select FORMAT((CONVERT(datetime,'2021-12-01 19:24:40') - CONVERT(datetime,'2021-12-01 17:00:00')),'hh:mm:ss')DffTime

這會幫助你

 DECLARE @DATE1 datetime = '2014-01-22 9:07:58.923'
 DECLARE @DATE2 datetime = '2014-01-22 10:20:58.923'
 SELECT DATEDIFF(HOUR, @DATE1,@DATE2) ,
        DATEDIFF(MINUTE, @DATE1,@DATE2) - (DATEDIFF(HOUR,@DATE1,@DATE2)*60)

 SELECT CAST(DATEDIFF(HOUR, @DATE1,@DATE2) AS nvarchar(200)) +
        ':'+ CAST(DATEDIFF(MINUTE, @DATE1,@DATE2)  -
                 (DATEDIFF(HOUR,@DATE1,@DATE2)*60) AS nvarchar(200))
As TotalHours 

由於任何 DateTime 都可以轉換為浮點數,並且數字的小數部分表示時間本身:

DECLARE @date DATETIME = GETDATE()

SELECT CAST(CAST(@date AS FLOAT) - FLOOR(CAST(@date AS FLOAT)) AS DATETIME

這將產生一個日期時間,如“一天中的 1900-01-01 小時”,您可以將其轉換為時間、時間戳,甚至使用轉換來獲取格式化的時間。

我想這適用於任何版本的 SQL,因為自 2005 版以來將日期時間轉換為浮點是兼容的。

希望能幫助到你。

如果有人仍在搜索查詢以顯示 hr min 和 sec 格式的差異:(這將以這種格式顯示差異:2 hr 20 min 22 secs)

SELECT
CAST(DATEDIFF(minute, StartDateTime, EndDateTime)/ 60 as nvarchar(20)) + ' hrs ' + CAST(DATEDIFF(second, StartDateTime, EndDateTime)/60 as nvarchar(20)) + ' mins' +          CAST(DATEDIFF(second, StartDateTime, EndDateTime)% 60 as nvarchar(20))  + ' secs'

OR 可以是問題中的格式:

CAST(DATEDIFF(minute, StartDateTime, EndDateTime)/ 60 as nvarchar(20)) + ':' + CAST(DATEDIFF(second, StartDateTime, EndDateTime)/60 as nvarchar(20))

共享一個工作時間超過 24 小時的變體。

DECLARE @sd DATETIME = CONVERT(DATETIME, '12/07/2022 11:10:00', 103)
DECLARE @ed DATETIME = CONVERT(DATETIME, '15/07/2022 13:20:05', 103)
Select Concat (
    DATEDIFF(DAY,   @sd, @ed), 'd ',
    DATEPART(Hour, CONVERT(Time,@ed - @sd)), 'h ',
    DATEPART(Minute, CONVERT(Time,@ed - @sd)), 'm ',
    DATEPART(Second, CONVERT(Time,@ed - @sd)), 's'
    )

輸出:

3d 2h 10m 5s

對於像我一樣擁有 MySql 版本 < 5.6 的人,他們沒有 TIMESTAMPDIFF 所以,我寫了 MYTSDIFF 一個 function,它接受 %s (%m 或 %i)分鍾 %h 標志以獲得秒、分和小時之間的差異2個時間戳。

享受

DROP FUNCTION IF EXISTS MYTSDIFF;

DELIMITER $$
CREATE FUNCTION `MYTSDIFF`( date1 timestamp, date2 timestamp, fmt varchar(20))
returns varchar(20) DETERMINISTIC
BEGIN
  declare secs smallint(2);
  declare mins smallint(2);
  declare hours int;
  declare total real default 0;
  declare str_total varchar(20);

  select cast( time_format( timediff(date1, date2), '%s') as signed) into secs;
  select cast( time_format( timediff(date1, date2), '%i') as signed) into mins;
  select cast( time_format( timediff(date1, date2), '%H') as signed) into hours;

  set total = hours * 3600 + mins * 60 + secs;  

  set fmt = LOWER( fmt);

  if fmt = '%m' or fmt = '%i' then
    set total = total / 60;
  elseif fmt = '%h' then
    set total = total / 3600;
  else
    /* Do nothing, %s is the default: */
    set total = total + 0;
  end if;

  select cast( total as char(20)) into str_total;
  return str_total;                  

  END$$
  DELIMITER ;

無需跳過箍。 從結束減去開始基本上會給你時間跨度(結合 Vignesh Kumar 和 Carl Nitzsche 的答案):

SELECT *,
    --as a time object
    TotalHours = CONVERT(time, EndDate - StartDate),
    --as a formatted string
    TotalHoursText = CONVERT(varchar(20), EndDate - StartDate, 114)
FROM (
    --some test values (across days, but OP only cares about the time, not date)
    SELECT
        StartDate = CONVERT(datetime,'20090213 02:44:37.923'),
        EndDate   = CONVERT(datetime,'20090715 13:24:45.837')
) t

輸出

StartDate               EndDate                 TotalHours       TotalHoursText
----------------------- ----------------------- ---------------- --------------------
2009-02-13 02:44:37.923 2009-07-15 13:24:45.837 10:40:07.9130000 10:40:07:913

在此處查看完整的演員表和轉換選項: https ://msdn.microsoft.com/en-us/library/ms187928.aspx

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM