電子書籍の厳選無料作品が豊富!

お世話になります。

いくら考えても正解が出てこないので、どうかご教示願えますでしょうか
▄█▀█●

使用SQL:
MySQL

要件:
現在時刻が、設定した時間内かどうかを判定したい。

例:
(1)1~16時の設定 :現在14時なら該当
(2)14時~1時の設定:現在0時なら該当

そもそも時間の”型”も、どれにすれば良いか解らず、現在”TIME”です。
start_time 14:00 end_time 01:00

(1)のように、範囲が≦で囲める場合は問題ないのですが (1時<16時)
(2)のように、≧の場合、どのように条件を書けば良いか分かりません。 (14時>1時)

では、(2)をTimeStampで設定した場合
start_time 0日14:00 end_time 1日01:00
のようになるかと思いますが、抽出時は何時になるのでしょうか?

例えば、上記設定がされているレコードに対し現在時刻が1:00の場合
start_time ≦ 1:00 ≦ end_time
とするかと思いますが、1:00というのは0日ですか1日ですか??

そうこう考え始めると何が何やら理解できなくなりました。

どうかヘルプください。。

A 回答 (3件)

場合分けだけですね



まずstart_timeがend_timeより小さければ普通に
現時刻がstart_timeとend_timeの間にあればOK

つぎにstart_timeがend_timeより大きければ日付をまたぐのと考えられるので
現時刻がstart_timeより大きいか、限時刻がend_timeより小さい必要があります。

それを踏まえるとこんな感じ

//準備
create table t_time(id int ,start_time time,end_time time);
insert into t_time values(1,'1:00:00','16:00:00'),(2,'14:00:00','1:00:00');

//結果
select * from t_time
where (start_time<end_time and (@now:=CURTIME()) between start_time and end_time)
or (start_time>end_time and (@now > start_time or @now<end_time));

テストのためにCURTIME()のところを
'00:00:00'や'15:00:00'などに書き換えてやると解ると思います

この回答への補足

すごい!天才ですか貴方は!(;゜Д゜)!

書いて頂いた事は、考えていたのですが、PHPで条件判断してどうこうと
ややこしい事を考えていたのですが、SQLでこんな事が実現できるのですね!

ですが、回答を頂いて恐縮なのですが教えていただいたコードを書いても
下記のようなエラーが出ます。

#1267 - Illegal mix of collations (utf8_general_ci,IMPLICIT) and (latin1_swedish_ci,NUMERIC) for operation '&gt;'

文字コードがおかしいようなのですが、私には何が問題なのか分かりません
お手数ですが再度、ご教示いただけませんでしょうか。お願いします。

補足日時:2012/02/28 14:23
    • good
    • 0

ごめんなさい。


私のphpMyAdminの環境だと問題なさそうです。
set names utf8;

的な処理を先に入れれば通るかもしれないですが
なんともいえません。
    • good
    • 0
この回答へのお礼

本当にありがとうございました。
どうやら、ユーザ変数を使うとエラーが出るようです。
それも5.1だと正常に動作しましたが、5.5だと無理でした。

ともあれ、本当に助かりました、ありがとうございました!!

お礼日時:2012/02/28 20:03

>#1267 - Illegal mix of collations



コードが違うテーブルを結合したりする際のエラーっぽいですね
今回挙げた例だと結合のロジックはないように見えますが
なにか拡張して使っているのでしょうか?

この回答への補足

早急な返信ありがとうございます!

まだ自分の環境に合わせてコードを変更した訳ではなく
提示していただいたコードをphpMyAdminのSQLで実行
しただけです。

(1)create table t_time(id int ,start_time time,end_time time);
insert into t_time values(1,'1:00:00','16:00:00'),(2,'14:00:00','1:00:00');

テーブルが作成される。


(2)select * from t_time
where (start_time<end_time and (@now:=CURTIME()) between start_time and end_time)
or (start_time>end_time and (@now > start_time or @now<end_time));

以下のエラーが表示される。

#1267 - Illegal mix of collations (utf8_general_ci,IMPLICIT) and (latin1_swedish_ci,NUMERIC) for operation '&gt;'


特に何かを結合しているわけではありません。

照合順序は[utf8_general_ci]です。

補足日時:2012/02/28 16:26
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す