MySql: может ли этот запрос быть более эффективным? - PullRequest
0 голосов
/ 30 марта 2020

У меня есть таблица с именем TIMINGS

---------------- create ------------- ---

CREATE TABLE TIMINGS(
    SNO TINYINT UNIQUE NOT NULL AUTO_INCREMENT,
    TIMINGTYPE VARCHAR(20) PRIMARY KEY,
    STARTTIME TIME NOT NULL,
    ENDTIME TIME NOT NULL
)

------------------ вставка ------------- --------

INSERT INTO TIMINGS(TIMINGTYPE, STARTTIME, ENDTIME) VALUES
('BREAKFAST','08:34:00','10:00:00'),
('LUNCH','11:30:00','13:30:00'),
('DINNER','19:00:00','20:30:00');

, поэтому я хочу знать TIMINGTYPE в соответствии с текущим временем и, если следующий TIMINGTYPE

ex. : если текущее время между началом завтрака и окончанием завтрака, то должно возвращаться 'BREAKFAST' и следующий TIMINGTYPE

Ожидаемый результат, например: * 10101 *

----------------------------------------------------------
     CURRENTTIME   |     NEXT
-----------------------------------------------------------
1.  BREAKFAST        |      LUNCH
-----------------------------------------------------------

, поэтому я сделал запрос, который работает согласно моему требованию:

---------------------- выберите ------------- ---------------

SELECT (
 CASE
    WHEN DATE_FORMAT(CONVERT_TZ(NOW(),'+00:00','+05:30') ,'%H:%i:%s' ) BETWEEN (select STARTTIME from TIMINGS where TIMINGTYPE = 'BREAKFAST') AND (select ENDTIME from TIMINGS where TIMINGTYPE = 'BREAKFAST') THEN 'BREAKFAST'    
    WHEN DATE_FORMAT(CONVERT_TZ(NOW(),'+00:00','+05:30') ,'%H:%i:%s' ) BETWEEN (select STARTTIME from TIMINGS where TIMINGTYPE = 'LUNCH') AND (select ENDTIME from TIMINGS where TIMINGTYPE = 'LUNCH') THEN 'LUNCH'
    WHEN DATE_FORMAT(CONVERT_TZ(NOW(),'+00:00','+05:30') ,'%H:%i:%s' ) BETWEEN (select STARTTIME from TIMINGS where TIMINGTYPE = 'DINNER') AND (select ENDTIME from TIMINGS where TIMINGTYPE = 'DINNER') THEN 'DINNER'
    ELSE 'NOT AVAILABLE'
 END
) as CURRENTTIME, 
(
 CASE
    WHEN DATE_FORMAT(CONVERT_TZ(NOW(),'+00:00','+05:30') ,'%H:%i:%s' ) BETWEEN (select ENDTIME from TIMINGS where TIMINGTYPE = 'BREAKFAST') AND (select STARTTIME from TIMINGS where TIMINGTYPE = 'LUNCH') THEN 'LUNCH'

    WHEN DATE_FORMAT(CONVERT_TZ(NOW(),'+00:00','+05:30') ,'%H:%i:%s' ) BETWEEN (select ENDTIME from TIMINGS where TIMINGTYPE = 'LUNCH') AND (select STARTTIME from TIMINGS where TIMINGTYPE = 'DINNER') THEN 'DINNER'

    ELSE 'BREAKFAST'
 END) as NEXT

Итак, мой вопрос, могу ли я сделать его более эффективным? Если да, то как!

ПРИМЕЧАНИЕ: я использую MySql

Любая помощь будет принята с благодарностью. Спасибо!

1 Ответ

1 голос
/ 30 марта 2020

Вы можете просто сделать:

select t.*
from timings t
where 
    (current_time between starttime endtime)    -- on-going
    or (current_time >= endttime)               -- next
order by starttime
limit 1

Лог c предназначен для поиска текущих или будущих записей, а затем отсортировать их по дате и сохранить самые ранние.

Обратите внимание, что использование current_time значительно упрощает логи времени c.


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

После обновления вопроса: вы можете используйте union all:

-- on-going
(select 'current', timingtype from timings where current_time between starttime and endtime)
union all
-- upcoming
(select 'upcomong', timingtype from timings where current_time > endtime order by starttime limit 1)

Если вы хотите, чтобы результаты в одной строке:

select 
    (select timingtype from timings where current_time between starttime and endtime) current,
    (select timingtype from timings where current_time > endtime order by starttime limit 1) upcoming
...