SQL-оператор для расчета времени между двумя днями - PullRequest
0 голосов
/ 29 марта 2019

У меня есть таблица базы данных MySql, где я хочу получить все записи между двумя временными метками.Каждый раз, когда статус меняется, я получаю новую метку времени и новый номер Status.

Примерно так: Status_List

 Status            Time_Start        Time_End
    2               14:00:12          14:13:33
    5               14:13:33          15:33:41
    9               15:33:41          16:02:11

Когда я ищу:

select * from Status_List where Time_Start between (15:00:00 and 16:00:00)
Output: 9  15:33:41  16:02:11

Но мне нужно:

Output: 5 15:00:00  15:33:41
        9 15:33:41  16:00:00

Возможно ли это?

Ответы [ 3 ]

1 голос
/ 29 марта 2019

Вы можете использовать запрос как этот:

SELECT 
    Status
    ,CAST(GREATEST('15:00:00',Time_Start) AS TIME(0)) as Time_Start
    , Time_end
FROM Status_List
WHERE 
    Time_Start BETWEEN '15:00:00' AND '16:00:00'
OR  
    Time_start < '15:00:00' AND Time_End > '15:00:00';

образец

MariaDB [test]> SELECT 
    -> Status
    -> ,CAST(GREATEST('15:00:00',Time_Start) AS TIME(0)) as Time_Start
    -> , Time_end
    -> FROM Status_List
    -> WHERE 
    -> Time_Start BETWEEN '15:00:00' AND '16:00:00'
    -> OR  
    -> Time_start < '15:00:00' AND Time_End > '15:00:00';
+--------+------------+----------+
| Status | Time_Start | Time_end |
+--------+------------+----------+
|      5 | 15:00:00   | 15:33:41 |
|      9 | 15:33:41   | 16:02:11 |
+--------+------------+----------+
2 rows in set (0.001 sec)

MariaDB [test]> 
1 голос
/ 29 марта 2019

С UNION ALL:

set @start = '15:00:00', @end = '16:00:00';

select status, @start start, time_end end from status_list
where time_start = 
  (select max(time_start) from status_list where time_start <= @start)
union all
select status, time_start, time_end from status_list
where time_start > @start and time_end < @end 
union all
select status, time_start, @end from status_list
where time_end = 
  (select min(time_end) from status_list where time_end >= @end)

См. Демоверсию .
Результаты:

| status | start    | end      |
| ------ | -------- | -------- |
| 5      | 15:00:00 | 15:33:41 |
| 9      | 15:33:41 | 16:00:00 |
0 голосов
/ 29 марта 2019

Если я правильно понял, вы хотите получить строки, где либо начало находится в диапазоне, либо в конце.Чтобы обрезать значения, выходящие за пределы диапазона, вы можете использовать выражение CASE.

SELECT status,
       CASE
         WHEN time_start < '15:00:00' THEN
           '15:00:00'
         ELSE
           time_start
       END time_start,
       CASE
         WHEN time_end > '16:00:00' THEN
           '16:00:00'
         ELSE
           time_end
       END time_end
       FROM status_list
       WHERE time_start >= '15:00:00'
             AND time_start < '16:00:00'
              OR time_end >= '15:00:00'
                 AND time_end < '16:00:00';

db <> fiddle

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