计算SQL查询中的时间

时间:2013-09-06 14:33:55

标签: php mysql sql date time

我经营一个营业时间网站,我们在商店开放时提供数据。

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

格式为:

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

表格字段:

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

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

目前在PHP中,我只是将它们分成':'和' - '并从那里开始。

3 个答案:

答案 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步:将当前列拆分为两个单独的列(例如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

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