これにより、指定された結果セットが返されます。
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 セッションのタイムゾーンで指定されているかのように効果的に評価されます。