0

したがって、私のmysqlデータベースでは、 と呼ばれる1つのフィールドに営業日と時間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 [現在の日付] および :#:# の数値が現在の時間よりも小さく、現在の時間よりも大きくなるようにします。

ヘルプ?私の脳はもう溶けています。

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

(面白いことに[、列の をエスケープできないように見えるので、正規表現の末尾に余分な数字がないことを確認する必要がありました。そうしないと、2 と 20 などに誤って一致する可能性があります。)

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

したがって、これはとんでもない応答になる可能性がありますが、これを行う 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

于 2013-07-03T20:29:29.097 に答える