我有一个存储在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'
如果业务是基于一天中的时间打开或关闭,我似乎无法找到一种方法来查找星期和输出。
有什么建议吗?
答案 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';
这应该有效。
但是,您确实应该为打开/关闭列使用适当的时间数据类型。