2016-11-11 5 views
0

Я новичок в SQL и задавался вопросом, можете ли вы помочь мне создать запрос, который сравнивает разницу во времени в днях, часах, минутах.SQL Date Diff между временем загрузки 1 и 2

Например,

Start time 1 = 13/01/2016, 16:00 
End time 1 = 14/01/2016, 18:00 

Так разница во времени должно быть 1 день и 2 часа не так ли?

Другой пример.

Start time 2 = 20/10/2016, 12:00 
End time 2 = 20/10/2016, 16:00 

Так

time difference is just 2 hours. 

Причина мне нужен этот запрос является создание отчета на основе разницы во времени между временем начала и время окончания задачи.

+0

Я удалил несовместимые теги базы данных. –

+0

Возможный дубликат [DATEDIFF в формате HH: MM: SS] (http://stackoverflow.com/questions/14445600/datediff-in-hhmmss-format) – sr28

+0

- это все еще Microsoft SQL? мой ezxample для MS – Cato

ответ

0

следить за проблемы с DATEDIFF, игнорирующей долей дней и т.д.

DECLARE @Starttime DATETIME = '20160113 16:00'; 
DECLARE @Endtime DATETIME ='20160114 15:59'; 

--calculate difference in seconds then use integer divides and MODULUS to extract days, hours, minutes 

;WITH DIFF_SECS AS (SELECT CAST(DATEDIFF(second,@Starttime,@Endtime) AS BIGINT) AS SD) 
SELECT SD/(24 * 3600) as NoDays, 
     (SD % (24 * 3600))/3600 as NoHours, 
     (SD % 3600)/60 AS NoMinutes 
         FROM DIFF_SECS; 

, если вы не используете Microsoft SQL - то формулы возможно еще полезна

разницы

, если X =»между моментами времени в

затем целых дней секундных = X/(24 * 3600), где разрыв представляет собой целое число деление (всегда округляется вниз)

+0

Спасибо, я нашел это очень полезным и в значительной степени именно тем, что я попросил, теперь мне просто нужно сделать его динамическим –

+0

И да, я использую сервер Microsoft SQL Server –

+0

@ L.gam - рад, что это помогло - вы могли сделайте оператор WITH своим основным запросом, затем в SELECT выполните арифметику по значению секунд - оператор WITH должен избегать многократно вычислять интервалы секунд в одном выражении SQL – Cato

0

в Oracle я хотел бы сделать это так:

-- this is only to create some data 
WITH MyRows AS (
    SELECT to_date('2000/11/30 12:59', 'YYYY/MM/DD HH24:MI') BEGINNING, to_date('2000/11/30 14:01', 'YYYY/MM/DD HH24:MI') ENDING FROM DUAL UNION 
    SELECT to_date('2000/12/01 12:59', 'YYYY/MM/DD HH24:MI') , to_date('2000/12/02 00:01', 'YYYY/MM/DD HH24:MI') FROM DUAL UNION 
    SELECT to_date('2000/12/30 12:59', 'YYYY/MM/DD HH24:MI') , to_date('2000/12/31 14:01', 'YYYY/MM/DD HH24:MI') FROM DUAL UNION 
    SELECT to_date('2000/12/31 12:59', 'YYYY/MM/DD HH24:MI') , to_date('2001/01/01 04:01', 'YYYY/MM/DD HH24:MI') FROM DUAL 
) 
-- this is the select 
SELECT 
    BEGINNING, 
    ENDING, 
    ENDING-BEGINNING IN_DAYS, 
    (ENDING-BEGINNING)*24 IN_HOURS, 
    (ENDING-BEGINNING)*24*3600 IN_SECONDS, 
    case 
    when (ENDING-BEGINNING)*24*60 >= 3 then round(((ENDING-BEGINNING)*24*60-3)*2) 
    else 0 
    end Total_cost_in_hamburgers 

FROM MyRows 
; 

timedifferences - это дни, и если вы хотите рассчитать с ним (f.e. после 3 минут каждая минута стоит 2 гамбургера), лучше рассчитать этот путь