2011-02-05 24 views
1

私は次のようにSQLiteのテーブルを持っている:SQLite:時刻に基づいて行を選択しますか?

+-----------+-------+ 
| StartTime | Name | 
+-----------+-------+ 
| 08:00:00 | zone1 | 
| 13:00:00 | zone2 | 
| 17:30:00 | zone3 | 
| 22:00:00 | zone4 | 
+-----------+-------+ 

私は現在の時刻に基づいて行を返します。クエリを記述しようとしています:

CurrentTimeを、それが返されます午前8時30分である場合CurrentTimeをは午後4時40分である場合ZONE1 それはCURRENTTIMEが午前4時01分であれば、それはゾーン4

を返しますZONE2 を返し、そうで...

は、これまでのところ、私はいくつかの運を持っていたではなく、私は

SELECT * FROM table WHERE StartTime >= time('now', 'localtime') 
ORDER BY StartTime LIMIT 1; 

を望んでいた、まさに私は、上記の文のいくつかのバリエーションを試してみたが、どれも私が後だ結果を返しません。

ありがとうございます!

答えて

5

「EndTime」フィールドを追加すると、現在の時間が開始時刻と終了時刻の範囲内にあるかどうかを簡単に確認できるため、人生を楽にします。例えば

データベースのテーブルには、次の...

+-----------+----------+-------+ 
| StartTime | EndTime | Name | 
+-----------+----------+-------+ 
| 08:00:00 | 12:59:59 | zone1 | 
| 13:00:00 | 17:29:59 | zone2 | 
| 17:30:00 | 21:59:59 | zone3 | 
| 22:00:00 | 07:59:59 | zone4 | 
+-----------+----------+-------+ 

から成っていた場合、...あなたは、単にの線に沿ってクエリを使用することができます:あなたは試したことがあり

SELECT Name FROM table WHERE StartTime >= time('now', 'localtime') 
AND EndTime <= time('now', 'localtime') 
ORDER BY StartTime LIMIT 1; 
+0

はい、追加フィールドを追加しないようにしようとしています。ゾーンが重複することなくゾーンの開始時刻を定義するだけであれば、ユーザーがテーブルに行を追加/削除する方が簡単です。 – LaLeX

+0

@LaLeX:クエリーを容易にするために必要な余分な列を保持するビューを構築できます。また、深夜過ぎのセクションでは、実際のゾーンがない場合は分割が必要な場合があります(他の分割時間を選択すると同じ問題が発生することもあります)。シームがあります)。また、終了時刻を終了後の瞬間とし、 '<'をリレーションとして使う方が簡単かもしれません。そうすれば、より少ない時間で算術演算を行うことができます。 –

0

持っている句?

SELECT * FROM table WHERE StartTime >= time('now', 'localtime') 
HAVING StartTime = MIN(StartTime) 
0

2つのバージョン。

これはわかりやすいですが、max(Name)は意味があるものとします。つまり、「名前」の値は低い順に並べられていると仮定します。

SELECT max(Name) 
FROM yourtable 
WHERE StartTime< time("16:40:00"); 

このバージョンでは、スカラーサブクエリが使用されます。それは名前に意味のある順序に依存しません。私はこのバージョンをもっと頑強にすると考えています。

SELECT Name 
FROM yourtable 
WHERE StartTime = (SELECT max(StartTime) 
        FROM yourtable 
        WHERE StartTime < time("16:40:00") 
); 
  • あなたは時間() 生産の time('now','localtime')と リテラルを交換したいと思うでしょう。
  • のいずれかのクエリを08:00ローカル 時間前に実行すると、空のセットがあることが予想されます。
+0

時間が22:00:00より前または08:00:00より前の場合は、指定されたテーブルの値に対して行を返しません... 22:00:00 ... – LaLeX

+0

を返します。いいえ、SQLite3が戻ります。 'Zone4'は22:00〜24:00です。実際には、「Zone4」はリテラル時間値が「24:59:59」になるまで戻ってきますが、これは私が知りませんでしたが、今までは有効な値でした。 –

関連する問題