MySQLで以下のテーブルを作成しました。
SQL
1create TABLE `Timer` ( 2 `id` int(11) NOT NULL AUTO_INCREMENT, 3 `time` time NOT NULL 4 PRIMARY KEY (`id`) 5)
レコードには以下が入っています。
id | time |
---|---|
1 | 20:00 |
2 | 21:00 |
3 | 0:00 |
4 | 1:00 |
ここで、現在時刻から未来の時刻に対して、最も近いレコードを取り出したいです。
例えば現在時刻が「20:30」であれば「id=2,time='21:00'」のレコードを取りだし、
現在時刻が「23:30」であれば「id=3,time='0:00'」の方を取り出したいです。
いろいろ試してみましたが、0時を跨ぐ場合の考慮が難しく解決できませんでした。
お分かりの方がいましたら教えて頂けませんか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答5件
0
内容が他の方と被っているのですが、LIMIT 1 の回答ばかりでtimeの同値考慮がなかったので。
SQL
1SELECT * FROM Timer a 2 WHERE IF(a.`time` >= TIME_FORMAT(NOW(),'%H:%i') 3 , SUBTIME(a.`time`,TIME_FORMAT(NOW(),'%H:%i')) 4 , SUBTIME(ADDTIME(a.`time`,'24:00'),TIME_FORMAT(NOW(),'%H:%i'))) = 5(SELECT MIN(IF(b.`time` >= TIME_FORMAT(NOW(),'%H:%i') 6 , SUBTIME(b.`time`,TIME_FORMAT(NOW(),'%H:%i')) 7 , SUBTIME(ADDTIME(b.`time`,'24:00'),TIME_FORMAT(NOW(),'%H:%i')))) 8 FROM Timer b);
投稿2017/07/26 04:27
総合スコア372
0
実質的にA.Ichiさんと同じですが、
SELECT *
FROM Timer
ORDER BY IF(TIME_FORMAT(NOW(),'%H:%i:00') > time, ADDTIME(time,'24:00'), time) ASC
LIMIT 1;
投稿2017/07/26 00:44
編集2017/07/26 00:46総合スコア100
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

0
ベストアンサー
SQL
1`time` time NOT NULL
の後に[,]がないです。
試行錯誤して、答えが出なかったのであれば、
そもそも0:00ではなく24:00としてデータ登録しても良いとは思いますが。
0:00にこだわるのであれば、以下のSQLで抽出できます。
SQL
1 SELECT 0 as time_sort 2 , T1.id 3 , T1.time 4 , DATE_FORMAT( NOW(), '%H:%i' ) as nwo_time 5 FROM Timer T1 6-- WHERE CAST( DATE_FORMAT( NOW(), '%H%i' ) as SIGNED ) <= CAST( DATE_FORMAT( T1.time, '%H%i' ) as SIGNED ) 7 WHERE CAST( '2330' as SIGNED ) <= CAST( DATE_FORMAT( T1.time, '%H%i' ) as SIGNED ) 8; 9 10create TABLE `Timer` ( 11 `id` int(11) NOT NULL AUTO_INCREMENT, 12 `time` time NOT NULL, 13 PRIMARY KEY (`id`) 14); 15insert into Timer 16values 17 (1,'20:00') 18,(2,'21:00') 19,(3,'0:00') 20,(4,'1:00') 21; 22 23SELECT V0.id 24 , V0.time 25 , V0.now_time 26FROM 27( 28 ( 29 SELECT 0 as time_sort 30 , T1.id 31 , T1.time 32 , DATE_FORMAT( NOW(), '%H:%i' ) as now_time 33 FROM Timer T1 34-- WHERE CAST( DATE_FORMAT( NOW(), '%H%i' ) as SIGNED ) <= CAST( DATE_FORMAT( T1.time, '%H%i' ) as SIGNED ) 35 WHERE CAST( '1000' as SIGNED ) <= CAST( DATE_FORMAT( T1.time, '%H%i' ) as SIGNED ) 36 ORDER BY T1.time 37 ) 38 UNION ALL 39 ( 40 SELECT 1 as time_sort 41 , T1.id 42 , T1.time 43 , DATE_FORMAT( NOW(), '%H:%i' ) as now_time 44 FROM Timer T1 45 WHERE 0 <= CAST( DATE_FORMAT( T1.time, '%H%i' ) as SIGNED ) 46 ORDER BY T1.time 47 LIMIT 1 48 ) 49) V0 50ORDER BY V0.time_sort 51 , V0.time 52LIMIT 1
投稿2017/07/25 14:54
編集2017/07/25 15:46総合スコア760
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/07/25 23:44 編集

0
date系関数で足し引きしてみました
sql
1SELECT *, 2 CASE WHEN `time` >= TIME_FORMAT(now(),'%H:%i') 3 THEN SUBTIME(`time`,TIME_FORMAT(now(),'%H:%i')) 4 ELSE SUBTIME( ADDTIME(`time`,'24:00'),TIME_FORMAT(now(),'%H:%i')) 5 END timegap 6FROM `Timer` 7ORDER BY 3 LIMIT 1;
投稿2017/07/25 23:11
総合スコア4070
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
SQLでいいなら
SQL
1select * from Timer where 現在時刻<=time order by time limit 1
投稿2017/07/25 13:50
総合スコア7466
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/07/25 23:37

あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/07/26 13:42