简体   繁体   中英

SQL: Add multiple time(7) columns to get total duration

I have a table with five time(7) columns as below:

[Duration1] [time](7)
[Duration2] [time](7)
[Duration3] [time](7)
[Duration4] [time](7)
[TotalDuration] [time](7)

╔══════════════════╦══════════════════╦══════════════════╦══════════════════╦══════════════════╗
║ Duration1        ║ Duration2        ║ Duration3        ║ Duration4        ║ TotalDuration    ║
╠══════════════════╬══════════════════╬══════════════════╬══════════════════╬══════════════════╣
║ 00:07:10.0000000 ║ 00:15:47.0000000 ║ 00:00:14.0000000 ║ 00:13:31.0000000 ║ 00:00:00.0000000 ║
╚══════════════════╩══════════════════╩══════════════════╩══════════════════╩══════════════════╝

How do I add Duration1, Duration2, Duration3 and Duration4 to get the total duration and update the TotalDuration column?

Would this work for you?

   --seconds
   DATEADD(ss,datepart("ss",Duration1) + datepart("ss",Duration2)  + datepart("ss",Duration3)  + datepart("ss",Duration4) ,
   --minutes
   DATEADD(mi, datepart("mi",Duration1) + datepart("mi",Duration2) + datepart("mi",Duration3) + datepart("mi",Duration4), 
   --hours
   DATEADD(hh, datepart("hh",Duration1) + datepart("hh",Duration2) + datepart("hh",Duration3) + datepart("hh",Duration4)
   --add to 00:00:00.0000000 as starting point
   , convert(time,'00:00:00.0000000'))))

You want to store durations. The appropriate data type for this would be an INTERVAL . SQL Server, however, does not have such a data type. So, you must find another way to store the durations. You could store a number of seconds for instance. You have decided to use the TIME interval instead. You cannot add up times, for what would 10 pm plus 9 pm even mean?

So, first convert your times into durations. Half past ten becomes ten hours and thirty minutes, or 37800 seconds. Then add up all those durations (seconds). In the end you can just show that duration, eg duration = 50000 seconds, or convert that back to a time (13:53:20).

select
  datediff(second, '00:00:00', duration1) +
  datediff(second, '00:00:00', duration2) +
  datediff(second, '00:00:00', duration3) +
  datediff(second, '00:00:00', duration4) as seconds
from mytable;

or

select
  cast(
    dateadd(second, 
            datediff(second, '00:00:00', duration1) +
            datediff(second, '00:00:00', duration2) +
            datediff(second, '00:00:00', duration3) +
            datediff(second, '00:00:00', duration4),
            '00:00:00')
    as time) as total_duration
from mytable;

Understand that SQL Server is really not the perfect tool to work with durations, and TIME may be a bad choice - not only because of the conversions needed, but for the fact that adding up hours can exceed 24 hours, which would be more than what you can show in a TIME .

In a DBMS that supports intervals like PostgreSQL, you'd store the durations in their appropriate data type INTERVAL and your query would look like this:

select duration1 + duration2 + duration3 + duration4 as total_duration
from mytable;

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM