Дата слияния, если они находятся в течение соседнего часа

0

У меня есть список даты и продолжительности:

-------------------------------------
Date                 |    Duration 
-------------------------------------
2018-08-08 16:00:00  |   00:45:00
2018-08-08 17:00:00  |   00:45:00
2018-08-08 18:00:00  |   00:45:00
2018-08-08 20:00:00  |   00:45:00
-------------------------------------

Желаемый вывод таблицы:

-------------------------------------
Date                 |    Duration 
-------------------------------------
2018-08-08 16:00:00  |   02:45:00
2018-08-08 20:00:00  |   00:45:00
-------------------------------------

Может ли кто-нибудь опробовать мой запрос mysql? мой мозг отстает.

Редактировать 1:

Я попробую выбрать для соответствия смежным запросам:

SELECT * FROM appointments WHERE Date BETWEEN ADDTIME(Date, '00:30:00') AND ADDTIME(Date, '01:00:00');

Отредактируйте это поле, кроме цикла, чтобы увидеть, больше ли я получаю строки.

  • 0
    Это действительно простая задача, которую можно решить с помощью цикла и переменной состояния, и немного проблематично решить с помощью запроса в MySQL. Вам нужно сделать это в запросе, или вы можете просто выбрать данные и обработать их на внешнем языке? У вас есть возможность включить это в хранимую функцию и сделать это в БД?
  • 0
    У меня есть два варианта: сохранить выбранный результат и выполнить работу с php, а затем обновить sql | или обновить все с моим sql. Мне интересно оба варианта. Я смотрю в первый атм, потому что я плохо знаю MySQL
Показать ещё 6 комментариев
Теги:

1 ответ

2
Лучший ответ

Рассмотрим следующее...

CREATE TABLE my_table
    (date DATETIME NOT NULL PRIMARY KEY, duration TIME NOT NULL);


INSERT INTO my_table
    (date, duration)
VALUES
    ('2018-08-08 16:00:00', '00:45:00'),
    ('2018-08-08 17:00:00', '00:45:00'),
    ('2018-08-08 18:00:00', '00:45:00'),
    ('2018-08-08 20:00:00', '00:45:00')
;

SELECT MIN(date) date
     , SEC_TO_TIME(SUM(TIME_TO_SEC(duration))) n
  FROM 
     ( SELECT x.*
            , CASE WHEN @prev >= date - INTERVAL 1 HOUR THEN @i := @i ELSE @i:= @i+1 END i
            , @prev := date prev
         FROM my_table x
            , (SELECT @prev := null, @i:=0) vars
        ORDER
           BY date
     ) a
 GROUP 
    BY i;

+---------------------+----------+
| date                | n        |
+---------------------+----------+
| 2018-08-08 16:00:00 | 02:15:00 |
| 2018-08-08 20:00:00 | 00:45:00 |
+---------------------+----------+

http://sqlfiddle.com/#!9/55a1c2c/3

Ещё вопросы

Сообщество Overcoder
Наверх
Меню