時間帯テーブルから直近空き時間取得

このQ&Aのポイント
  • 現在の日時を基準に時間帯テーブルから直近で空いている日付とその時間帯を取得するSQLを教えてください。
  • jikan_tblというテーブルには未来の予定のレコードが登録されています。15分間隔で予定のレコードを登録していますが、現在の日時を基準に直近で予定を入れられる時間帯を取得するためのSQLを教えてください。
  • 例えば、現在の日時が2013年9月27日の10時の場合、同日の10時45分から11時が空いているという情報を取得するSQLを教えてください。
回答を見る
  • ベストアンサー

時間帯テーブルから直近空き時間取得

現在の日時を基準に下記テーブルより直近で空いている日付とその時間帯を求めるSQLを教えて下さい。 下記のjikan_tblは、未来の予定のレコードが登録されています。 1レコード目は、2013年9月27日10時から同日の10時15分までの予定のデータです。 15分間隔で予定のレコードを登録していますが、現在の日時が2013年9月27日の10時の場合、 直近で予定を入れられる時間帯を知りたいのでSQLで同日の10時45分から11時が空いていると取得できればベストです。 ちなみに同日の11時15分から11時30分と取得されてしまうのは、NGです。 jikan_tbl date_start int(8), time_start int(4), date_end int(8), time_end int(4) jikan_tblのレコード 20130927 | 1000 | 20130927 | 1015 20130927 | 1015 | 20130927 | 1030 20130927 | 1030 | 20130927 | 1045 20130927 | 1100 | 20130927 | 1115 20130927 | 1130 | 20130927 | 1140 難しく調べても分かりません。 知恵を貸して下さい。 宜しくお願いします。 os: windows 7 eclipse: Version: 4.2.0 Build SDK: Android 4.3(API 18) PHP 5

  • MySQL
  • 回答数2
  • ありがとう数4

質問者が選んだベストアンサー

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

datetimeバージョンをざっと //元データ create table t_jikan(start datetime,end datetime); insert into t_jikan values('2013-09-27 10:00','2013-09-27 10:15'),('2013-09-27 10:15','2013-09-27 10:30'),('2013-09-27 10:30','2013-09-27 10:45'),('2013-09-27 11:00','2013-09-27 11:15'),('2013-09-27 11:30','2013-09-27 11:40'); //後ろ時間が空いているviewをつくっておく create view v_jikan as select j1.start,j1.end from t_jikan as j1 left join t_jikan as j2 on j1.end=j2.start where j2.start is null; //空き時間一覧 select v1.end as start,min(v2.start) as end from v_jikan as v1 inner join v_jikan as v2 on v1.end < v2.start group by start; //特定時間の直近の空き時間 select v1.end as start,min(v2.start) as end from v_jikan as v1 inner join v_jikan as v2 on v1.end < v2.start where v1.end>='2013-09-27 10:00' group by start order by start limit 1; ここで'2013-09-27 10:00'を '2013-09-27 10:45'や'2013-09-27 10:50'や'2013-09-27 11:50'に 変えると状況がヒットするレコードが変わることがわかる

yanagihk
質問者

補足

回答ありがとうございます。 実際に実行してみました。 素晴らしいです。 こんな難しいSQLは初めてですが、自分なりに意味を調べて勉強します。 本当にありがとうございました。

その他の回答 (1)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

intをつかっている限り処理が複雑になるのでかなり難しいと思います startとendをそれぞれdatetimeにしてはいけないの?

yanagihk
質問者

補足

回答ありがとうございます。 解決方法があれば int型でなくdatetimeに変えようと思います。 datetimeにする場合はどのようなSQL文になるのですか?

関連するQ&A

  • 時間帯テーブルから直近空き時間取得(再質問)

    先程、次のような質問をして、素晴らしい回答をいただきました。 http://questionbox.jp.msn.com/qa8279886.html しかし、ベストな回答でない事に気付きましたので、再び質問させていただきます。 ちなみに、データベースはMYSQLです。 下記が先程の質問の回答を踏まえて少し質問を変えたものです。 重要なのが☆の部分です。 ************************************************************************ 現在の日時を基準に下記テーブルより直近で空いている日付とその時間帯を求めるSQLを教えて下さい。 下記のjikan_tblは、未来の予定のレコードが登録されています。 1レコード目は、2013年9月27日10時から同日の10時15分までの予定のデータです。 ☆(先程の質問はこちら) 15分間隔で予定のレコードを登録していますが、現在の日時が2013年9月27日の10時の場合、 直近で予定を入れられる時間帯を知りたいのでSQLで同日の10時45分から11時が空いていると取得できればベストです。 ちなみに同日の11時15分から11時30分と取得されてしまうのは、NGです。 ☆(今回の質問ではこちら) 15分間隔で予定のレコードを登録していますが、直近で予定を入れられる15分間隔の時間帯を知りたいので 次のそれぞれのパターンで取得できればベストです。 現在日時:2013年9月27日の8時50分の場合 → 取得時間帯は9:00~9:15 現在日時:2013年9月27日の9時05分の場合 → 取得時間帯は9:15~9:30 現在日時:2013年9月27日の10時00分の場合 → 取得時間帯は10:45~11:00 現時点から直近の15分区切りの時点を求め、求めた時点から直近で空いている15分間の時間帯を求めたいです。 先程の回答では、27日10時現在では、素晴らしい結果がでましたが、現在時間を27日9時と設定しても 10時45分から11時が求められました。 私の質問の書き方が悪かったと思います。 回答していただいた方にお詫びします。 jikan_tbl start datetime, end datetime jikan_tblのレコード 2013-09-27 10:00| 2013-09-27 10:15 2013-09-27 10:15| 2013-09-27 10:30 2013-09-27 10:30| 2013-09-27 10:45 2013-09-27 11:00| 2013-09-27 11:15 2013-09-27 11:30| 2013-09-27 11:40 知恵を貸して下さい。 宜しくお願いします。 os: windows 7 eclipse: Version: 4.2.0 Build SDK: Android 4.3(API 18) PHP 5

    • ベストアンサー
    • MySQL
  • 時間の計算によってある行を取り出す

    MySQLバージョン4.1.16を使っています。 id start_time1 end_time1 start_time2 end_time2 という時刻が入っている項目があったときに、(時刻はdate("y/m/d H:i:s")という形式です) (end_time1 - start_time1)の値と(end_time2 - start_time2)の値の合計が 例えば5時間30分以上だった場合にのみ、その行を取り出すというSQL文は どのように書けば良いのでしょうか? 合計が24時間以上だった場合も考慮に入れないといけないので難しそうな気がしますが、、

    • ベストアンサー
    • MySQL
  • 日付間の判定について

    質問させてください。 PostgreSQLで以下のテーブルがあるとします。 test_tbl ---------------------------- id==========int4 start_day===timestamp end_day=====timestamp ----------------------------- 以下のテーブルにデータをinsertしたいとかんがえています。 このとき、既に入力されているデータの start_day, end_dayにかぶらずに入力したいとかんがえています。 たとえば ---------------------------- record1 ---------------------------- start_day:2003-11-27 18:00:00 end_day :2003-11-27 18:15:00 ---------------------------- record2 ---------------------------- start_day:2003-11-27 18:45:00 end_day :2003-11-27 19:00:00 ----------------------------- というレコードが既にtest_tblに格納されていたら、 ---------------------------- insert1(●) ---------------------------- start_day:2003-11-27 18:20:00 end_day :2003-11-27 18:40:00 ----------------------------- insert2(●) ---------------------------- start_day:2003-11-27 17:45:00 end_day :2003-11-27 17:50:00 ----------------------------- insert3(×) ---------------------------- start_day:2003-11-27 18:05:00 end_day :2003-11-27 18:30:00 ----------------------------- insert4(×) ---------------------------- start_day:2003-11-27 18:50:00 end_day :2003-11-27 19:20:00 ----------------------------- insert5(×) ---------------------------- start_day:2003-11-27 18:30:00 end_day :2003-11-27 19:20:00 ----------------------------- 上記の判別するSQLがうまくつくれません。 どうかアドバイスを下さい。宜しくおねがいいたします。

  • 時間内かどうかの抽出

    お世話になります。 いくら考えても正解が出てこないので、どうかご教示願えますでしょうか ▄█▀█● 使用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日ですか?? そうこう考え始めると何が何やら理解できなくなりました。 どうかヘルプください。。

    • ベストアンサー
    • MySQL
  • CでSQLのテーブルを読む

    SQLのテーブルがあります。 レコードを1行ずつ読むソースを教えてください。 データベースはさっぱり分かりません。 create table mytable (  name text,  age int ); このテーブルからint型のageを列挙したいと思います。 intを読むわけですから EXEC SQL BEGIN DECLARE SECTION; int i; EXEC SQL END DECLARE SECTION; が必要ですよね。あとはさっぱり分かりません。

  • sql文の中での時間取得

    sql文の中で以下のように時間を指定してselectしています。ですが、時間を「sqlの実行時間からn分前までの間」に修正したいと考えています。どなたかご教示いただけませんでしょうか。 select count(*) from tableA where hoge = '0000' and end_time >= cast('2000/1/01 00:00' as timestamp) and end_time < cast('2011/1/31 00:00' as timestamp) たとえば select count(*) from tableA where hoge = '0000' and end_time >= sqlを実施した時間から45分前 and end_time < sqlを実施した時間 のようにしたいです。 ご協力お願い致します。

  • 2つのテーブルのデータまとめて取得したい

    SQL Server2008を使用しているのですが、どうのようにデータを取得すれば良いか わからず困っております。 例えば、 名前は違うが全く同じテーブルが2つあるとします。 テーブルAには6レコード、テーブルBには3レコードのデータが存在するとします。 この時、単純に6レコード+3レコードの 9レコード分をひとつのテーブルとしてデータを 取得するにはどのようなSQL文を書けばよいでしょうか? SELECT * FROM テーブルA, テーブルBでは18レコードもデータを取得してしまい、且つ フィールド数も増加してしまいます。 宜しくお願いいたします。

  • テーブルの行を増やしたい・・・。

    テーブルの行を増やし、 データを一年文作成したいのですが・・・。 CREATE TABLE CALENDAR_TBL( YYYYMMDD DATE NOT NULL, DayData NUMBER(3) NULL CONSTRAINT CALENDAR_TBL_PKEY PRIMARY KEY(YYYYMMDD)); このテーブルに、2005年のデータ365レコードを挿入したいのですが、 1つのINSERT文(SQL)で、できますでしょうか? (※PL/SQLは除きます。) ※不可能であれば、SELECT文(下記のように)を一年分用意してUNIONで作成するのですが、 これ以外に簡単にできないでしょうか? INSERT INTO CALENDAR_TBL ( (SELECT SYSDATE + 000, DayData FROM CALENDAR_TBL) UNION (SELECT SYSDATE + 001, DayData FROM CALENDAR_TBL) UNION (SELECT SYSDATE + 002, DayData FROM CALENDAR_TBL) UNION (SELECT SYSDATE + 003, DayData FROM CALENDAR_TBL) ・・・(省略)・・・ UNION (SELECT SYSDATE + 365, DayData FROM CALENDAR_TBL) )

  • 日時の期間での抽出

    スケジュール帳のWebアプリを作成していて PostgreSQLを使用しています。 sc_tblというテーブルのday_timeというカラムに日時 to_doというカラムに予定を入れているのですが 日時2006/12/01 01:00のデータを期間の抽出条件で抽出する時 2006/11/30 20:00~2006/11/30 26:00という条件で抽出できるような SQL文はあるのでしょうか。(1:00を25:00として抽出したい) 下記2つのSQLでは無理でした。 ・その1 select day_time, to_do from sc_tbl where day_time >= cast('2006-11-30 20:00:00' as timestamp) and day_time <= cast('2006-11-30 26:00:00' as timestamp); ・その2 select day_time, to_do from sc_tbl where day_time >= to_date('2006-11-30 20:00:00','YYYY-MM-DD H24:MI:SS') and day_time <= to_date('2006-11-30 26:00:00','YYYY-MM-DD H24:MI:SS');

  • PostgresqlのCASE分の使い方

    SELECT MAX(CASE WHEN fld IS NULL THEN 0 ELSE fld END) FROM tbl ; tblテーブルのfldの最大値を取得するSQLを作りたいのですが、tblテーブルにレコードが登録されていない時に「0」を出力したいと思っています。 上記のSQLだとレコードが0の場合はfldの値がないため、0を出力してくれません。 どのように修正すればレコード0件のときに「0」を出力してくれるでしょうか。 宜しくお願いします。