入退室時間の確認方法

このQ&Aのポイント
  • 部屋の入り口にあるICカードチェッカーのログを活用し、入退室時間の確認方法についてまとめます。
  • Mysql5.1を使用して、ICカードチェッカーのログから入室・退室データを抽出し、レポート作成を行います。
  • 入室日時、退室日時、および名前を表示するレポート形式を考えましたが、データの比較方法についてアドバイスを求めています。
回答を見る
  • ベストアンサー

入退室時間の確認方法

部屋の入り口にあるICカードチェッカーのログを利用してレポート作成を行う予定です。 DBはMysql5.1を利用しています。 mysql> select * from t1 ; +------+---------------------+ | id | jikan | hito | inout | +------+---------------------+ | 1 | 2011-07-20 12:50:01 |hiro|in| | 2 | 2011-07-20 13:23:37 |misa|in| | 3 | 2011-07-20 14:08:41 |hiro|out| | 4 | 2011-07-20 15:27:02 |sasato|in| | 5 | 2011-07-20 16:31:38 |misa|out| | 6 | 2011-07-20 17:42:19 |hiro|in| | 7 | 2011-07-20 18:19:09 |hiro|out| | 8 | 2011-07-20 19:07:12 |misa|in| +------+---------------------+ (jikanはdatetime形式) レポート形式は下記を予定 |入室日時|退室日時|名前| ☆考え方 1.whereで「in」を指定して別テーブルB1を作成 2.whereで「out」を指定して別テーブルC1を作成 とここまで考えたのですがココから先がおもいつきません。 テーブルB1とC1のjikanを比較? B1テーブルのhiroが12:50にinした時間を基準にC1テーブルの hiroのout時間のtimediffが小さいものを探す・・・? どなたか妙案がありましたらご教授いただきたく。 よろしくお願いします。

  • MySQL
  • 回答数3
  • ありがとう数3

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

  • ベストアンサー
  • nda23
  • ベストアンサー率54% (777/1415)
回答No.1

データに重複が無いと仮定します。 考え方 (1)人単位に'in'のデータを抽出する。→A (2)人単位に'out'のデータを抽出する。→B (3)AからBを見て同じ人で、時刻が大きいものの中から  最も小さい時刻が退出時刻になる。 select A.jikan as nyuushitsu,min(B.jikan) as taishutsu, A.hito from (select jikan,hito from t1 where inout='in') A left join (select jikan,hito from t1 where inout='out') B on A.hito=B.hito and A.jikan<B.jikan group by A.jikan,A.hito 6行目の結合条件に着目して下さい。 不等号の結合条件というのを思いつかないと 解決しない問題です。サブクエリを使うことで、 B1とかC1は不要になります。

gnomezine
質問者

お礼

サンプルSQLありがとうございます。 早速試してみます。 以上よろしくお願いします。

その他の回答 (2)

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

ちなみに#1さんの回答はサブクエリを使わず、こう書いた方が インデックスが効きやすいかもしれません select A.jikan as nyuushitsu,min(B.jikan) as taishutsu,A.hito from t1 AS A left join t1 AS B on A.hito=B.hito and B.inout='out' and A.jikan<B.jikan where A.inout='in' group by A.jikan,A.hito

gnomezine
質問者

お礼

サンプルSQLありがとうございます。 こちらも試させていただきます。 以上よろしくお願いします。

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

おなじhitoが一日なんども入退室するのであれば 入室と退室に相関関係があるので最初から1組で管理すればすっきりしますよ 処理としては入室時にhitoと入室時間を書きこみ、退出時間はNULL 退出時に退出時間がNULLのhitoのレコードに退出時間を書きこむ

gnomezine
質問者

お礼

アイデアありがとうございます。 機械から出てくる生ログが時系列に 記載されているだけなので・・・・ 設計するときのポイントとして 覚えておきます。

関連するQ&A

  • エクセルで簡単なフロチャートを書く方法

    エクセルで簡単なフロチャートを書く方法を探しております。 テーブルに記入するとフロチャートが自動的に作成できる方法はありませんか? 【ケース(1)】 テーブル .in:out .A:B .B:C フロチャート .A→B→C 【ケース(2)】 テーブル .in:out .A:B .B:A フロチャート .A⇔B 【ケース(3)】 テーブル .in:out .A:B .C:B .D:B .E:B フロチャート ...D ...↓ .A→B←C ...↑ ...E といった感じです 以上、宜しくお願い致します

  • MySQLのTIMEDIFFのバグの解決方法

    MySQLのTIMEDIFFのバグについて教えて下さい。 環境:MySQL 5.0.77 MySQLのテーブルにdateというtimedate型のカラムを作ります。 カラムには 2011-01-01 00:00:00 とう形でデータが登録してあります。 現在の時刻と登録してあるdateの差を出したいと思い、 TIMEDIFF(NOW(), date) を使うと 「838:59:59」という値が返ってきてしまいます」 下記のホームページに MmySQLのバージョンが4.1のバグと記載されていました。 http://onlineconsultant.jp/pukiwiki/?MySQL%204.1%20TIMEDIFF%E3%81%8C%E3%81%8A%E3%81%8B%E3%81%97%E3%81%84 バージョン5でも同じような症状が出るのでしょうか? 解決策はどのようにすればよいのでしょうか? 複数のサーバーで実験できる環境があるのですが、MySQL5.0.77でちゃんと計算される場合と、上記のような変な数字になってしまう場合があります。

    • ベストアンサー
    • MySQL
  • 時間の比較についてアドバイスお願いします

    こんにちは。 予約システムのようなイメージの時間比較についての質問です 曜日と開始時間・終了時間を一組に、すべての条件が現在日時に 含まれている場合にTRUEという条件を作りたいのですが 間隔をあけて、同日に二つの条件が存在することもある場合 問い合わせに時間がかかってしまい、どうにかならないかと 思いまして質問に参りました 具体的な条件(今が水曜日の15:00とします) Aさん:(1)水曜、10:00~12:00 と (2)水曜、15:00~18:00 Bさん:(1)水曜、09:00~16:00 と (2)木曜、09:00~16:00 Cさん:(1)火曜、10:00~12:00 と (2)水曜、10:00~12:00 Aさんは(2)、Bさんは(1)、Cさんは(2)でHITします 私が組んだ問い合わせの具体的な内容が 曜日の部分がTRUE かつ、開始時間と現在時間の差分が0以上 かつ 終了時間と現在時間の差分が0以下(TIMEDIFFを使ってます)という 条件を1セットに、二つ目の条件は ORで同様の文を繋いでます 一セットの条件だとすぐに抽出が完了するのですが、ORで二個目を 繋いだ場合、すごく時間がかかってしまうので、他にいい方法があれば 教えて頂けますでしょうか 実コードは以下のような感じです。(1セット分です) (week01.".$week." = '1' AND TIMEDIFF('".$date."',stime01) >= '00:00:00' AND TIMEDIFF('".$date."',IF(etime01 <= stime01,ADDTIME(etime01,'24:00:00'),etime01)) < '00:00:00') ※ $week は テーブル名となる曜日の略字(Wedなど) ※ $date は 現在日時 何か良いアドバイスがあれば、よろしくお願いします MySQL クライアントのバージョン: 5.0.45です

    • ベストアンサー
    • MySQL
  • データが存在しないか条件に一致する場合の条件文

    bテーブルにc=a.cのデータが存在しない、あるいはc=a.cに一致するフィールドdの時刻が10分経過している場合にUPDATEを実行するクエリを考案中です。ベタ書きすると以下のようになると思うのですが、同じSELECT文が2回出てきます。これらをまとめることは可能でしょうか。 UPDATE a SET foo=? WHERE id=? AND (NOT EXISTS(SELECT d FROM b WHERE c = a.c) OR TIMEDIFF((SELECT d FROM b WHERE c = a.c), NOW()) > '00:10:00');

    • ベストアンサー
    • MySQL
  • 構成比を求めるSQL文につきまして

    科目別受講時間の構成比をRAITO_TO_REPORT関数を使って求めたいと思っています。 以下ですとWHERE句で利用者を特定しての構成比は求まるのですが、where句を除き例えば全利用者で抽出を行うと当然ですが全体の合計jikanの構成比が求まります。 構成比を個人別にしつつ利用者全員を抽出するSQL文の書き方がわかりません・・・。わかる方どうかお教えてください。 SELECT riyousya, kamoku, sum(jikan), to_char(RATIO_TO_REPORT(sum(jikan)) over() * 100,'90.00') || '%' as kouseihi FROM テーブルA WHERE  riyousya = yamada GROUP BY riyousya,kamoku

  • IN( )の中に、項目をたくさん入れたら処理が重くなってしまう

    MySQLで↓このような、処理をしたいんですが select TABLE_A.* from TABLE_A where TABLE_A.id in (select TABLE_B.TABLE_A_ID from TABLE_B ) このように、INの中にサブクエリを入れてるんですが、 ものすごく重くなってしまい、検索されるまでに通常の数倍かかってしまいます。 サブクエリの該当件数は30件ほどで、これからも増えて行く予定です。 サブクエリ発行部分を in (1,2,3…29,30)と 生書きしても、やや重く、どうやら、inの中に項目を やたらたくさん入れると重くなるみたいです。 このようなINの項目が無数に増えても、 処理をより軽くするには、どうすればいいのでしょうか?

    • ベストアンサー
    • MySQL
  • クエリの作成方法

    支店に月次の実績報告を毎月出すのですが、現在は全支店のテーブルAと実績内容のデータがあるテーブルBがあります。この2つのテーブルを使って、 (1)テーブルAとテーブルBを使ったクエリ1を作成しレポートIを作成 (2)テーブルAとテーブルBの差分クエリでレポートIIを作成 (3)(1)と(2)で作成したレポートを支店コード順に手作業で並び変えています。 ※上記レポートIとIIの様式は同様で、レポートIIには「今月の実績はなし」との文言が入っているだけです。 これをどうにかして、レポートをひとつだけにして最初から支店コード順に印刷できないものかと、試行錯誤を繰り返していますが、初心者の私ではいいアイディアが浮かびません。 皆さんのお知恵を拝借させてください。よろしくお願いします。

  • 副問い合わせの限界値はどれくらいなのでしょうか? 

    副問い合わせの限界値はどれくらいなのでしょうか?  現在下記のようなSQLを考えています。 SELECT * FROM A_TABLE WHERE a_field in ( SELECT a_field FROM B_TABLE WHERE b_field := ?c ) ; ※(便宜上、外部変数の指定を[:= ?c]としました) B_TABLEの検索に引っかかったデータをinの条件にしてA_TABLEを検索するのですが、 B_TABLEの検索で出力される結果(サブクエリで出力される件数)が 現在の理論値は平均でおおよそ1000件、最大10万件になる予定です。 これに対し、10万件での問い合わせに副問い合わせの実行はmysqlで可能なのでしょうか?  現状のテスト環境では10万件のテストデータを用意できない状況です・・・。 また、どなたか副問い合わせでのサブクエリ出力件数の限界値をご存知の方がいらっしゃいましたらご教授頂ければ幸いです。 宜しくお願い致します。

    • ベストアンサー
    • MySQL
  • 顧客と商品ごとに購入日時が最新のデータを取得したい

    お世話になります。 以下のテーブル1からサンプル1のようなデータを抽出したいのですが、SQLはどのように書いたらよいでしょうか。 ・顧客と商品ごとに購入日時が最新のデータを取得 ・商品は左側の番号が同じ場合は購入日が最新のデータのみ抽出したい データベースは MySQL5 です。 よろしくお願いいたします。 ●テーブル1 顧客  商品  購入日時 ---------------------------------  A  2-2  2014-04-23 08-00-00  A  2-1  2014-04-21 08-00-00  B  2-3  2014-04-20 09-00-00  B  2-2  2014-04-18 06-00-00  B  2-1  2014-04-15 05-00-00  A  1-3  2014-04-12 08-00-00  A  1-2  2014-04-10 04-00-00  C  2-2  2014-04-09 05-00-00  C  2-1  2014-04-08 06-00-00  C  1-2  2014-04-07 08-00-00  C  1-1  2014-04-06 05-00-00  A  1-1  2014-04-05 02-00-00  B  1-2  2014-04-04 02-00-00  B  1-1  2014-04-03 01-00-00 ●サンプル1 顧客  商品  購入日時 ---------------------------------  A  2-2  2014-04-23 08-00-00  B  2-3  2014-04-20 09-00-00  A  1-3  2014-04-12 08-00-00  C  2-2  2014-04-09 05-00-00  C  1-2  2014-04-07 08-00-00  B  1-2  2014-04-04 02-00-00

    • ベストアンサー
    • MySQL
  • 3テーブル外部結合方法について

    3つのテーブルを外部結合したいのですが・・・、 こんがらがってしまいました。 A,B,Cの3テーブルがあり、A,B,Cの順に外部結合 (LEFT OUTER JOIN)したいのですが、 A,BのテーブルについてはWhere句の条件指定が 必要です。 Select From (Select AA.a From A AA Where b = xxxx) BB Left Outer Join (Select CC.b From B CC Where c = eeee and BB.a = CC.b) On ???? こんな感じでつまづいてしまいました・・・