我经营一个营业时间网站,在那里我们展示商店是否营业的数据。
到目前为止,我计算它是否在 PHP 中打开,但我想知道是否可以直接在查询中完成。这将大大加快速度,因为我不必获取所有行(超过 10.000 行)以仅显示打开的行,但可以直接限制查询。
格式为:
HH:MM-HH:MM
08:00-16:00
表字段:
mon, tue, wed, thu, fri, sat, sun
因此,查询需要知道现在是哪一天,拆分字段以计算它是否在当前时间内。
目前在 PHP 中,我只是将它们拆分为":"和"-"并从那里解决。
这是一个
可怕的表格结构。您应该将打开/关闭时间存储在单独的字段中作为正确的时间值。例如
create table storehours (
id int auto_increment primary key,
storeID int,
open time,
closed time
);
然后你可以做一个非常简单的事情:
SELECT storeID
WHERE curtime() BETWEEN open AND closed
@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
第 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