質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

5回答

3132閲覧

【MySQL】最も近い時刻を取得する

souri-t

総合スコア16

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2017/07/25 13:37

MySQLで以下のテーブルを作成しました。

SQL

1create TABLE `Timer` ( 2 `id` int(11) NOT NULL AUTO_INCREMENT, 3 `time` time NOT NULL 4 PRIMARY KEY (`id`) 5)

レコードには以下が入っています。

idtime
120:00
221:00
30:00
41:00

ここで、現在時刻から未来の時刻に対して、最も近いレコードを取り出したいです。
例えば現在時刻が「20:30」であれば「id=2,time='21:00'」のレコードを取りだし、
現在時刻が「23:30」であれば「id=3,time='0:00'」の方を取り出したいです。

いろいろ試してみましたが、0時を跨ぐ場合の考慮が難しく解決できませんでした。
お分かりの方がいましたら教えて頂けませんか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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

shoko1

総合スコア372

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

souri-t

2017/07/26 13:42

ありがとうございます。他とは違うアプローチですね。 こちらも期待の抽出ができました。
guest

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
n884

総合スコア100

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

souri-t

2017/07/26 13:40

ありがとうございます。とてもシンプルながら期待のレコードを抽出できました。
guest

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
tomari_perform

総合スコア760

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

souri-t

2017/07/25 15:45 編集

回答ありがとうございます。 確かに0:00を24:00に置き換えた方が扱いやすかったですね。 これでも解決できそうな気がします。思いつかなかったです。 ちなみに記述頂いたSQL文ですが、 「2330」の箇所を変えていろいろ実行しましたが、 抽出できたレコードが常に「0:00」のものになりました。 コメント行にされているnow()の部分もマシンが「0:32」の時刻に実行してみましたが、 同じ結果でした。
tomari_perform

2017/07/25 15:46

回答の中で修正しておきました。
ahodana

2017/07/25 23:44 編集

二つ目のサブクエリ WHERE句不要では? 全部ヒットする気が
tomari_perform

2017/07/26 06:51

正直、どちらでも良いです。 仕様次第なんですが、24:00以降の記載をお勧めしたので、 -01:00等でも大丈夫なように記載しただけです。 time型で登録できる範囲をご確認ください。 https://dev.mysql.com/doc/refman/5.6/ja/time.html
guest

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

A.Ichi

総合スコア4070

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

SQLでいいなら

SQL

1select * from Timer where 現在時刻<=time order by time limit 1

投稿2017/07/25 13:50

takasima20

総合スコア7458

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takasima20

2017/07/25 13:54

timeには時分以外も入ってる前提ですが、もしや…
ahodana

2017/07/25 23:37

日付跨ぎ 22:00過ぎは翌日の最も早い時間が抜けているからマイナスなのかと
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問