查找是一项业务是开放的:MySQL小时计算

时间:2010-09-22 16:44:41

标签: php mysql select

我有一个存储在locations表中的业务列表,并且存储在该表中的是业务开放和关闭的小时数:

location
`mon_1_open`
`mon_1_closed`
`tue_1_open`
`tue_1_closed`
`wed_1_open`
`wed_1_closed`

等...

我将时间存储在完整的小时和分钟内,所以说商家周一上午9:00到下午5:30营业。mon_1_open ='900'和mon_1_closed ='1730'

如果业务是基于一天中的时间打开或关闭,我似乎无法找到一种方法来查找星期和输出。

有什么建议吗?

2 个答案:

答案 0 :(得分:2)

这不一定能回答你的问题,但从长远来看可能会这样。

您的数据库方案似乎存在缺陷。它肯定没有正常化。我会在它成为一个大问题之前解决这个问题,因为你已经注意到它很难找到某些业务时间。这是一个可能更适合的草案。

TABLE: locations
    id INT AUTO_INCREMENT PRIMARY KEY
    name VARCHAR(50) 

TABLE: location_hours
    id INT AUTO_INCREMENT PRIMARY KEY
    location_id INT  -  Foreign Key references locations table
    day CHAR(3) - (examples: mon, tue, wed, thu, fri, sat, sun)
    hours VARCHAR(4) - (could also be int)

然后要获取今天的日期,可以使用DATE_FORMAT %a在MySQL中完成此操作,这是一个示例查询:

SELECT locations.name, location_hours.hours 
FROM locations 
    JOIN location_hours ON locations.id = location_hours.location_id 
WHERE location_hours.day = DATE_FORMAT(NOW(), '%a') 
    AND location.name = 'Someway Business'
ORDER BY location_hours.hour

由于ORDER BY知道0900 < 1430 VARCHAR,因为INT active 不需要打开/关闭应该知道如何对其进行排序),但添加企业时的代码需要更新此记录,否则您需要另一个字段date来表示是否应在查询中使用该行。只记得使用24小时。再次,这是一个模拟,我只是在现场创建它,所以它可能会使用一些改进,但这比你使用当前代码做一个hack更好。

<强>更新

解决有关查找是否已打开或关闭的评论:

只需使用PHP date('Hi')函数并调用$sql = "SELECT locations.name, location_hours.hours FROM locations JOIN location_hours ON locations.id = location_hours.location_id WHERE location_hours.day = DATE_FORMAT(NOW(), '%a') AND location.name = 'Someway Business' ORDER BY location_hours.hour"; $result = mysql_query($sql) or trigger_error("SQL Failed with Error: " . mysql_error()); $times = array(); while ($row = mysql_fetch_assoc($result)) { if (empty($times['open'])) { $times['open'] = $row['hours']; }else { $times['closed'] = $row['hours']; } } $currentTime = date('Hi'); if ($times['open'] <= $currentTime && $times['closed'] > $currentTime) { echo "Open"; }else { echo "Closed"; } 这将在24小时内拉出当前时间,然后你只需要做一个简单的if语句来查看它是否在它之间,如果它是,它打开了。

IE:

{{1}}

鉴于我的逻辑是正确的。同样,这只是伪代码的一个使用示例。鉴于我刚刚在现场写下来。以上假设您一次只查询一个企业。

答案 1 :(得分:1)

$dayOfWeek = strtolower(date('D'));

$query = '
    SELECT
        location,
        '.$dayOfWeek.'_1_open <= '.date('Gi').' AND
        '.$dayOfWeek.'_1_closed >= '.date('Gi').' as is_open';

这应该有效。

但是,您确实应该为打开/关闭列使用适当的时间数据类型。