重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

判定条件がうまく設定できずに困っています。

|No| on/off | 開始時間 |
| 1 | 0 or 1 | 0 ~ 23 |
| 2 | 0 or 1 | 0 ~ 23 |
| 3 | 0 or 1 | 0 ~ 23 |
| 4 | 0 or 1 | 0 ~ 23 |
| 5 | 0 or 1 | 0 ~ 23 |
| 6 | 0 or 1 | 0 ~ 23 |

DBに設定された開始時間(0時から23時。設定値も数値で0~23)と現在時間(0~23)とを比較して、開始時間になればデータを送信するというプログラムの判定条件なのですが、データ数はon/offによって比較対象にするかどうかを決められるので、データ数は0から最大6つの可変になります。
onになっているデータが2つ以上あれば開始時間を参照して、常にひとつはデータが取得される方式です。
また開始時間に設定されるデータに重複する開始時間のデータは存在せず、おのおのユニークな開始時間が設定されています。

たとえば現在時間が0時で、設定された開始時間が22時・23時だと23時のデータを取得してくる、現在時間が10時で9時・11時・13時と設定されていれば11時・13時は開始時間より前なので9時のデータを取得する、そのようなイメージです。

データ数が2つのときの条件はまだ何とかなりそうなのですが、3つ以上になったときにどのような条件を指定すればよいのか全然わかりません・・・。
お力添えいただければ幸いです。

A 回答 (2件)

> max()での判定だとたとえば23時と0時のデータがあるときに0時のほうを取る条件がいまひとつ上手くいかないような気がするのですが。



where句により、現在時刻が0時なら23はひっかからないから大丈夫かと。

> 現在時間が0時で、設定された開始時間が22時・23時だと23時のデータを取得してくる

これに対応するなら、0時を24時とみなして再検索するとか。あえてSQLで書くならこんな感じ:

select max( t ) % 24 from (
select [開始時間]+24 as t from DB where [on/off] = 1 and [開始時間] <= 現在時間
union
select [開始時間] as t from DB where [on/off] = 1 and [開始時間] <= 現在時間+24 );

ここで%は剰余演算子。あと開始時刻の制約をこっそり訂正。

やっぱり試さないで書いてます。
    • good
    • 0

> DB



試さないで書いてますが、SQLが使えるなら、こんな感じ?

select max( [開始時間] ) from DB where [on/off] = 1 and [開始時間] < 現在時間;

戻り値がデータ取得時刻。※ここでは1のときonであると仮定してます。

> onになっているデータが2つ以上あれば

については、次のクエリで確認:

select count( [on/off] ) from DB where [on/off] = 1;

SQLが使えないときは、別途検討。

この回答への補足

max()での判定だとたとえば23時と0時のデータがあるときに0時のほうを取る条件がいまひとつ上手くいかないような気がするのですが。
1レコードに開始時間でソートした上でlag()やlead()を使って前後のレコードを持っておいてcase文で判定をする、そのような方法も考えたのですがいずれにしろ判定の条件が上手く立てられないので困っているところです・・・。

補足日時:2011/01/29 19:29
    • good
    • 0

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