因此,在我的mysql数据库中,我在一个名为days
的字段中打开日期和小时,数据以下列格式存储:
[Monday:9:17[Tuesday:9:17[Wednesday:10:18[
正如您可能已经猜到的那样:[Day:From:Till
和括号只是PHP的分词,可以区分有多少天。
我一直在想什么是查询,但我无法弄清楚,所以基本上我需要使用PHP获取当前的日期和时间:
date(l); // Day in full text representation.
date(G); // current hour in 24 hour format.
所以基本上我需要一个简单的英语听起来像的查询:
选择所有FROM businessdetails WHERE列日期CONTAINS [当前日期]和:#:#个数小于当前小时且大于当前小时。
帮助?我的大脑现在正在融化。
答案 0 :(得分:2)
刚才注意到你改变了答案。以下可能不再适用,但我会将其留待将来参考......
我建议为此设置一个单独的子表。
auto increment ID
|
| the store name the store description etc..
| / / /
.--------------------------------------------------.
| id | name | description | etc |
|--------------------------------------------------|
| 1 | mary's kitchen | a fancy restaurant | etc |
| 2 | willow creek inn | we serve breakfast | etc |
'--------------------------------------------------'
auto increment ID
| The STORES.id
| / the day (0-SUN, 6-SAT)
| _________/ / the 24h time OPEN (HH:MM:SS *TIME*)
| / _________/ ____/ the 24h time CLOSE (HH:MM:SS *TIME*)
| / / / /
.----------------------------------------------.
| id | store_id | day | time_open | time_close |
| 1 | 1 | 1 | 08:30:00 | 20:00:00 |
| 2 | 1 | 2 | 08:30:00 | 20:00:00 |
| 3 | 1 | 3 | 10:30:00 | 20:00:00 |
| 4 | 1 | 4 | 11:00:00 | 20:00:00 |
| 5 | 1 | 5 | 08:30:00 | 22:30:00 |
'----------------------------------------------'
现在,根据您要显示的内容,您可以查询表格:
SELECT
stores.name AS store_name,
stores.description AS store_description,
store_hours.day AS store_hours_day,
TIME(store_hours.time_open) AS store_open,
TIME(store_hours.time_close) AS store_close
FROM
stores
JOIN
store_hours
ON
store_hours.store_id = stores.id
结果:http://sqlfiddle.com/#!2/e6872/8/0
通过这种表结构和关系,您可以毫不费力地创建粒度查询。
答案 1 :(得分:2)
老实说,最好的办法是规范化数据库,以便进行更好的查询。但我喜欢看我是否可以解决不可能的情况,所以这就是你能做的!
这将检查周二上午11点开放的所有商家
SELECT * FROM `businessdetails` WHERE `date` REGEXP 'Tuesday:(0|1|2|3|4|5|6|7|8|9|10|11):(11|12|13|14|15|16|17|18|19|20|21|22|23)[^0-9]'
(有趣的是我发现我似乎无法逃脱列中的[
因此我必须确保正则表达式最后没有任何额外数字或者可能错误地匹配2和20或其他什么。)
以下是如何通过PHP生成REGEXP字符串的方法:
<?php
$regexp = date('l') . ':(' . join('|', range(0, date('G'))) . '):(' . join('|', range(date('G'), 23)) . ')[^0-9]';
免责声明我实际上并不建议这样做,但我认为它很聪明并且想分享,因为它直接回答了你的问题。
答案 2 :(得分:1)
所以这可能是一个很好的回应,但这是一种方法来做到这一点......(虽然我确信必须有更明显更好的方法:
$day = date(l); // Day in full text representation.
$time = date(G); // current hour in 24 hour format.
$sql = "SELECT businessID FROM (SELECT SUBSTRING_INDEX(t_time,':',1) as start, SUBSTRING_INDEX(LEFT(t_time,POSITION('[' IN t_time) - 1), ':',-1) as end,businessID from (SELECT SUBSTRING_INDEX(SUBSTR(`column_date`,POSITION('$day' IN `column_date`) + LENGTH('" . $day . "') + 1),':',2) as t_time, businessID from `businessdetails ` where `column_date` like '%$day%') as t_table_1) as t_table_2 where start >= $time && end <= $time";
希望工作=)
PS如果您需要帮助,可以使用以下所有字符串函数: http://dev.mysql.com/doc/refman/5.0/en/string-functions.html