簡體   English   中英

MySql:這個查詢可以更有效嗎?

[英]MySql: can this query be more efficient?

我有一張名為TIMINGS的表

- - - - - - - - 創建 - - - - - - - -

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

前任。 :如果早餐開始和早餐結束之間的當前時間那么它應該返回'BREAKFAST'和下一個TIMINGTYPE

預期輸出例如:

----------------------------------------------------------
     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

任何幫助將不勝感激。 謝謝!

你可以這樣做:

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

邏輯是搜索正在進行或將來的記錄,然后按日期對其進行排序並保留最早的記錄。

請注意,使用current_time大大簡化了時間邏輯。


編輯

問題更新后:您可以使用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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM