2013-09-06 3 views
0

매장이 열려있는 경우 데이터를 표시하는 영업 시간 사이트를 운영합니다.SQL 쿼리 내 시간 계산

지금까지 계산이 PHP에서 열려 있거나하지 않지만 쿼리에서 직접 수행 할 수 있는지 궁금합니다. 이것은 열려있는 행만 표시하기 위해 모든 행 (10.000 이상)을 가져올 필요가 없으므로 쿼리 속도를 직접적으로 제한 할 수 있기 때문에 속도가 빨라집니다.

형식은 다음과 같습니다

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

테이블 필드 :

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

그래서 쿼리는 어떤 일 알 필요가있다, 그것은 현재 시간 내에 있는지 계산하는 필드를 분할합니다.

현재 PHP에서는 ':'과 '-'로 나누었습니다.

+1

대신 개방 문제는 상점 분명히 개방하지 않는 것입니다 –

답변

3

그건 끔찍한 테이블 구조입니다. 당신은 적절한 시간 값으로 별도의 필드에 열기/닫기 시간을 저장해야합니다. 예 :

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

은 그럼 당신은 매우 간단한 작업을 수행 할 수 있습니다

SELECT storeID 
WHERE curtime() BETWEEN open AND closed 
+0

가까운 그 두 개의 열,/같은 시간에게 일주일의 하루를 닫을 수 있습니다, 이런 식으로하지 않습니다. 그런 다음 상점 당 7 개의 행이 필요합니다. 현재 12400 개의 행을 가진 테이블을 생성하는 12000 개의 상점은 적절한 데이터베이스를 위해 그다지 많은 수의 행을 가지고 있지 않습니다. – Emil

+0

84k rows. '요일'필드를 추가하여 특정 요일에 대한 기록이없는 폐쇄 된 요일을 추적 할 수 있습니다. –

+0

좋아. 나는 atm을 사용하는 구조가 매우 잘 만들어지지 않고 그냥 가야한다는 것을 알고 있습니다. 다시 해 보겠습니다. 고맙습니다. – Emil

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