我经营一个营业时间网站,我们在商店开放时提供数据。
到目前为止,我在PHP中打开或不打开计算,但我想知道是否可以直接在查询中执行。这会加快速度,因为我不必获取所有行(超过10.000)只显示打开的行,但可以直接限制查询。
格式为:
HH:MM-HH:MM
08:00-16:00
表格字段:
mon, tue, wed, thu, fri, sat, sun
因此查询需要知道它是哪一天,拆分字段以计算它是否在当前时间内。
目前在PHP中,我只是将它们分成':'和' - '并从那里开始。
答案 0 :(得分:3)
这是一个糟糕的桌面结构。您应该将SEPARATE字段中的打开/关闭时间存储为适当的时间值。 e.g。
create table storehours (
id int auto_increment primary key,
storeID int,
open time,
closed time
);
然后你可以做一个非常简单的事情:
SELECT storeID
WHERE curtime() BETWEEN open AND closed
答案 1 :(得分:0)
第1步:将当前列拆分为两个单独的列(例如open
和close
)。
第2步:SELECT * FROM shops WHERE HOUR(NOW()) BETWEEN open AND close;
或者,您可以即时拆分列:
SELECT * FROM shops
WHERE HOUR(NOW()) BETWEEN
SUBSTRING_INDEX(openclose, '-', 1) AND
SUBSTRING_INDEX(openclose, '-', -1);
但实际上,拆分列,上面的查询无法使用列上的任何索引。
考虑商店每天的开放时间不同的情况。
CREATE TABLE opening_times (
store_id INT NOT NULL,
day_of_week INT NOT NULL, -- 1 = Sunday
open TIME NOT NULL,
close TIME NOT NULL,
PRIMARY KEY (store_id),
FOREIGN KEY (store_id) REFERENCES store(id),
INDEX (day_of_week, open, close) -- suggested index
);
SELECT store.* FROM opening_times
JOIN store ON store.id = opening_times.store_id
WHERE
DAYOFWEEK(NOW()) = day_of_week
AND HOUR(NOW()) BETWEEN open AND close
答案 2 :(得分:0)
@ marc-b是对的。但遗失了。
create table storehours (
id int auto_increment primary key,
storeID int,
dayId int,
open time,
closed time
);
insert into `storehours` (`id`, `storeID`, `dayId`, `open`, `closed`) VALUES
(1, 123, 5, '09:00:00', '18:00:00'),
(2, 456, 6, '12:00:00', '19:00:00');
SELECT storeID from storehours
WHERE dayId = dayofweek(now()) and curtime() BETWEEN open AND closed