Расчет продолжительности между двумя датами, которые идут за месяцы (расщепление) - PullRequest
0 голосов
/ 13 декабря 2018

Я смотрю на вычисление разницы между двумя полями даты в SQL (SQL Server), которые могут (или не могут) перекрываться на другой месяц.

У меня есть поле TimeFrom, поле TimeTo иполе состояния.Оба поля времени имеют формат даты и времени, а статус числовой.

Вот пример дат:

TimeFrom               TimeTo                Status
2018-04-01 09:03:27    2018-07-15 10:11:13   12

Мне нужно рассчитать время между этими датами, но всоответствующий месяц, и я изо всех сил пытаюсь решить это самостоятельно.

Вывод будет выглядеть примерно так:

YearMonth | Status | Duration (hh:mm:ss)
2018-04 | 12      | xx:xx:xx
2018-05 | 12 | xx:xx:xx
2018-06 | 12 | xx:xx:xx

Ответы [ 2 ]

0 голосов
/ 17 декабря 2018

Предлагаемое решение ...

SET DATEFORMAT YMD
DECLARE @aux TABLE (TimeFrom datetime, TimeTo datetime, Status int)
DECLARE @res TABLE (YearMonth varchar(7), Status int, Sc int)

INSERT INTO @aux VALUES ('2018-04-01 09:03:27','2018-07-15 10:11:13',12)

DECLARE @secs int, @dt datetime, @fi datetime, @fo datetime,
        @f1 datetime, @f2 datetime, @st int

SELECT TOP 1 @fi = TimeFrom, @fo = TimeTo, @st = status FROM @aux

SELECT @dt = DATEADD(mm, DATEDIFF(mm, 0, @fi), 0), @f1 = @fi
WHILE @dt < @fo
BEGIN
    SELECT @f2 = CASE 
            WHEN DATEADD(mm, 1, @dt) < @fo
                THEN DATEADD(mm, 1, @dt)
                ELSE DATEADD(ss, 1, @fo)
            END
    SELECT @secs = DATEDIFF(ss, @f1, DATEADD(s, - 1, @f2))
    INSERT INTO @res VALUES (CONVERT(varchar(7), @dt, 120), @st, @secs)
    SELECT @f1 = @f2, @dt = DATEADD(mm, 1, @dt)
END

SELECT YearMonth,status
    ,CAST(Sc / 3600 AS varchar) + '.'
    +RIGHT('0' + CAST((Sc - 3600 * (Sc / 3600)) / 60 AS varchar(2)), 2) + '.'
    +RIGHT('0' + CAST(Sc % 60 AS varchar(2)), 2) AS [Duration (hhh.mm.ss)]
FROM @res
0 голосов
/ 13 декабря 2018

это должно работать:

set serveroutput on;
create or replace procedure d061(d1  in  date, d2  in date ) as
dd number;
hh24 number;
mi number;
ss number;
begin
select extract(day from intrvl) into  dd
    from (
          select   to_timestamp_tz (d1,'DD MON YYYY hh24:mi:ss')
                 - to_timestamp_tz (d2,'DD MON YYYY hh24:mi:ss') as intrvl
         from dual
         );


select  extract(hour from intrvl) into hh24
        from (
          select   to_timestamp_tz (d1,'DD MON YYYY hh24:mi:ss')
                 - to_timestamp_tz (d2,'DD MON YYYY hh24:mi:ss') as intrvl
         from dual
         );
select  extract(minute from intrvl) into mi

        from (
          select   to_timestamp_tz (d1,'DD MON YYYY hh24:mi:ss')
                 - to_timestamp_tz (d2,'DD MON YYYY hh24:mi:ss') as intrvl
         from dual
         );


select extract(second from intrvl) into ss from (
          select   to_timestamp_tz (d1,'DD MON YYYY hh24:mi:ss')
                 - to_timestamp_tz (d2,'DD MON YYYY hh24:mi:ss') as intrvl
         from dual
         );
        DBMS_OUTPUT.PUT_LINE('DD  HH24  MI SS');
        DBMS_OUTPUT.PUT_LINE(dd || '  '||hh24||'  ' ||mi||'  ' ||ss);
end;
/

declare
begin 
d061(sysdate+1,sysdate);
end;
/

вывод:

DD  HH24  MI SS
1  0  0  0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...