0

因此,在我的 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. 

所以基本上我需要一个简单的英语查询,听起来像:

SELECT all FROM businessdetails WHERE column date CONTAINS [current date] and :#:# numbers to be less than current hour and greater than current hours。

帮助?我的大脑现在正在融化。

4

3 回答 3

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

STORE_HOURS

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

有了这个表结构和关系,您就可以毫不费力地创建细粒度查询。

于 2013-07-03T20:10:08.223 回答
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]'

(有趣的是,我发现我似乎无法逃脱[列中的

以下是通过 PHP 生成 REGEXP 字符串的方法:

<?php

$regexp = date('l') . ':(' . join('|', range(0, date('G'))) . '):(' . join('|', range(date('G'), 23)) . ')[^0-9]';

免责声明我实际上并不建议这样做,但我认为它很聪明并想分享,因为它直接回答了您的问题。

于 2013-07-03T20:27:54.590 回答
1

So this might be a hell of a response, but here is one way to do it... (Although I'm sure there must be more significantly better ways:

$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";

Hopefully that works =)

PS If you need help there are all these string functions you could use: http://dev.mysql.com/doc/refman/5.0/en/string-functions.html

于 2013-07-03T20:29:29.097 回答