SQLite: сумма различий между двумя группами дат по каждой дате - PullRequest
0 голосов
/ 03 сентября 2018

У меня есть база данных SQLite с датами начала и окончания

sqlite start and stop times

С помощью следующего SQL-запроса я получаю разницу в часах между началом и остановкой:

SELECT starttime, stoptime, cast((strftime('%s',stoptime)-strftime('%s',starttime)) AS real)/60/60 AS diffHours FROM tracktime; 

difference hours between two dates

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

Результат должен выглядеть примерно так:

  • 2018-08-01: 12 часов
  • 2018-08-02: 24 часа
  • 2018-08-03: 12 часов
  • 2018-08-04: 0 часов
  • 2018-08-05: 1 час
  • 2018-08-06: 14 часов
  • 2018-08-07: 8 часов

1 Ответ

0 голосов
/ 03 сентября 2018

Вы можете попробовать это, использовать CTE RECURSIVE создать таблицу календаря для каждого времени начала и окончания даты и выполнить некоторые вычисления.

Схема (SQLite v3.18)

CREATE TABLE tracktime(
  id int,
  starttime timestamp,
  stoptime timestamp
);

insert into  tracktime values 
(11,'2018-08-01 12:00:00','2018-08-03 12:00:00');
insert into  tracktime values 
(12,'2018-09-05 18:00:00','2018-09-05 19:00:00');

Запрос № 1

WITH RECURSIVE cte AS (
    select id,starttime,date(starttime,'+1 day') totime,stoptime
    from tracktime
    UNION ALL
    SELECT  id,
            date(starttime,'+1 day'),
            date(totime,'+1 day'),
            stoptime
    FROM cte
    WHERE date(starttime,'+1 day') < stoptime
)

SELECT  strftime('%Y-%m-%d', starttime),(strftime('%s',CASE 
              WHEN totime > stoptime THEN stoptime
              ELSE totime
            END) -strftime('%s',starttime))/3600 diffHour
FROM cte;

| strftime('%Y-%m-%d', starttime) | diffHour |
| ------------------------------- | -------- |
| 2018-08-01                      | 12       |
| 2018-09-05                      | 1        |
| 2018-08-02                      | 24       |
| 2018-08-03                      | 12       |

Посмотреть на БД Fiddle

...