3

現在の時刻が営業時間内かどうかを示すために、特別な値を返す必要があります。

テーブルの場所で

ID    OPEN     CLOSE  
1     14:00    16:00  
2     12:00    15:00
3     10:00    14:00

クエリで特別なフィールドを返す必要があります: PLACE_IS_OPEN - true または false。

そのため、時間があるときに返される結果は次の14:35とおりです。

ID      PLACE_IS_OPEN
1       1
2       1
3       0

これについての降下方法は何でしょうか?

4

2 に答える 2

5

TIME(NOW())開店時間と閉店時間の間にあるテストを行い、ブール値の結果を列として返します。これは、MySQL の DATETIME または TIME 列である場合、そのまま機能します。OPEN,CLOSE

SELECT
  ID,
  OPEN,
  CLOSE,
  CASE WHEN TIME(NOW()) BETWEEN `OPEN` AND `CLOSE` THEN 1 ELSE 0 END AS PLACE_IS_OPEN
FROM yourtable

これらが適切なタイプではなく文字列である場合は、変換するTIME必要がありますSTR_TO_TIME()

  CASE WHEN TIME(NOW()) BETWEEN TIME(STR_TO_DATE(`OPEN`, '%H:%i')) AND TIME(STR_TO_DATE(`CLOSE`, '%H:%i')) THEN 1 ELSE 0 END AS PLACE_IS_OPEN

CASEまた、MySQL ではステートメントを単純化できるはずですBETWEEN。これは、 がそのまま 0 または 1 を返すためです。

SELECT
  ID,
  OPEN,
  CLOSE,
  (TIME(NOW()) BETWEEN TIME(STR_TO_DATE(`OPEN`, '%H:%i')) AND TIME(STR_TO_DATE(`CLOSE`, '%H:%i'))) AS PLACE_IS_OPEN
FROM yourtable
于 2012-07-18T17:56:52.923 に答える
2

これにより、指定された結果セットが返されます。

SELECT t.ID
     , CASE WHEN t.open <= DATE_FORMAT(NOW(),'%H:%i')
             AND t.close > DATE_FORMAT(NOW(),'%H:%i')
       THEN 1 ELSE 0 END AS PLACE_IS_OPEN
  FROM places t
 ORDER BY t.ID

OPENおよびCLOSE列が文字データ型であり、24 時間時計としてフォーマットされた文字列を含む場合。

(注: BETWEEN を使用すると、CLOSE の正確な分で誤った結果が得られます。DATE_FORMATたとえば、時間 '16:00:45' は '16 としてフォーマットされます。 :00'、これは指定された CLOSE と同じかもしれませんが、実際には CLOSE で指定された実際の時刻から 45 秒後です。)

また、夜 10 時から午前 2 時まで開いている場合など、真夜中をまたがる行がないことを確認する必要がありCLOSEますOPEN。(このクエリが機能するためには、そのような期間はテーブル内の 2 つの別々の行として表される必要があります。1 つの行は OPEN から '24:00' まで、もう 1 つの行は '00:00' から CLOSE までです。)

CLOSE真夜中の時刻は「24:00」として表す必要があることに注意してください。(つまり、24 時間営業の場所は、OPEN='00:00' および CLOSE='24:00' と表すことができます。)

データがこれらのルールに従っていない場合 (たとえば、クローズの午前 0 時が 00:00 として表されるか、CLOSE が OPEN よりも小さい場合、これらの条件を処理するためにクエリを「改善」する必要があります。


OPEN 列と CLOSE 列のデータ型が (文字ではなく) TIME である場合は、関数TIME()の代わりに関数を使用して、クエリも変更する必要がありDATE_FORMAT()ます。(また、この場合、現在時刻が終了時刻と正確に一致する場合に値 1 を返すことが許容される場合は、BETWEEN を使用できます。現在時刻の値 '16:00:00' は、 「16:00:00」なので、その場合に 1 を返すか 0 を返すかによって異なります。

time_zoneまた、NOW() 関数は、(MySQL) セッションの変数の現在の設定で評価されることに注意してください。(したがって、そのテーブルの OPEN 時間と CLOSE 時間は、MySQL セッションのタイムゾーンで指定されているかのように効果的に評価されます。

于 2012-07-18T18:03:47.023 に答える