0

我经营一个营业时间网站,我们会在其中展示商店是否营业的数据。

到目前为止,我计算它是否在 PHP 中打开,但我想知道是否可以直接在查询中进行。这将大大加快速度,因为我不必获取所有行(超过 10.000 行)来仅显示打开的行,但可以直接限制查询。

格式为:

HH:MM-HH:MM
08:00-16:00

表字段:

mon, tue, wed, thu, fri, sat, sun

所以查询需要知道它是哪一天,拆分字段以计算它是否在当前时间之内。

目前在 PHP 中,我只是将它们拆分为 ':' 和 '-' 并从那里解决。

4

3 回答 3

3

这是一个可怕的表结构。您应该将打开/关闭时间存储在单独的字段中作为适当的时间值。例如

create table storehours (
   id int auto_increment primary key,
   storeID int,
   open time,
   closed time
);

然后你可以做一个非常简单的:

SELECT storeID
WHERE curtime() BETWEEN open AND closed
于 2013-09-06T14:36:20.377 回答
0

第 1 步:将当前列拆分为两个单独的列(例如openclose)。

第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
于 2013-09-06T14:37:09.857 回答
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
于 2013-09-06T14:48:22.857 回答