- ベストアンサー
Access2007で必要なレコードを抽出したい
- Access2007を使用して特定のレコードを抽出する方法について説明します。
- データベース内の複数のレコードから、特定の条件を満たすレコードを抽出する方法をご紹介します。
- VBAを使用して、指定した日付と人物のレコードを抽出し、その空き時間を計算する方法について解説します。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
はい。そのつもりで回答しました。 結果や如何に? ※時間が重複している場合は考えてません 2013/03/01 1111 AAA 09:00 10:00 ↓AAAさんが掛け持ちで何かやっている場合など 2013/03/01 1111 AAA 09:00 10:00 2013/03/01 1111 AAA 09:00 09:30 その他、未入力の場合など。 12~13時の処理ですが 前回回答では、8:40 ~18:00で考えてましたが 8:40 ~ 12:00 と 13:00 ~ 18:00 に分けて Where 終了時間 >= #12:00# Where 開始時間 <= #13:00# の二つのレコードセットでそれぞれ処理すれば良さそうです。 ただ、昼食時間をまたがっている場合があると・・・没。 2013/03/01 1111 AAA 11:00 13:30 もっと洗練された考え方が有るような気がします。
その他の回答 (2)
- 30246kiku
- ベストアンサー率73% (370/504)
変てこな考えかも(処理性能は考えてませんので・・・) 除外する・・・これは結構厄介なものと思います。 タイムスライスして、ある・ない・・・で結果を得ても良いのかも フィールド「時刻」(日付/時刻型:主キー)のみのテーブル「T時刻」を作り、 0:00 ~ 23:59 までのデータを入れておきます。(60 * 24 = 1440 レコード) この「T時刻」を基準に、対象者の予定日と開始時間、終了時間を結び付けて、 その結果、結びついていない時刻をグルグルとみて、空きの開始、終了を処理すれば・・・ 元テーブル名を★★と仮定すると SELECT Q1.時刻 FROM T時刻 AS Q1 LEFT JOIN (SELECT * FROM ★★ WHERE 予定日=#2013/3/1# AND 氏名='AAA') AS Q2 ON (Q1.時刻 Between Q2.開始時間 AND Q2.終了時間) WHERE (Q2.氏名 Is Null) AND ((Q1.時刻 Between #8:40# AND #12:00#) OR (Q1.時刻 Between #13:00# AND #18:00#)); の様な感じで・・・・ 得られる結果は、10:01 ~ 12:00 の 120レコードと 14:01 ~ 18:00 の240レコード 全体で 360レコードになるので、360分空いている事がわかります。 ただ、注意しないといけないのは、時刻の境目・・・・ 例えば、上記の空きで 15:00 ~ 15:30 を予定に入れたら、 14:01 ~ 14:59、15:31 ~ 18:00 に分かれます。 ということは、レコード数=分 ではなくなる? そこで、開始と終了の時刻が重ならないように、終了の方を1分前にします。 SELECT Q1.時刻 FROM T時刻 AS Q1 LEFT JOIN (SELECT * FROM ★★ WHERE 予定日=#2013/3/1# AND 氏名='AAA') AS Q2 ON (Q1.時刻 Between Q2.開始時間 AND DateAdd("n",-1,Q2.終了時間)) WHERE (Q2.氏名 Is Null) AND ((Q1.時刻 Between #8:40# AND #11:59#) OR (Q1.時刻 Between #13:00# AND #17:59#)); これで得られる結果は、10:00 ~ 11:59 の 120レコードと 14:00 ~ 17:59 の240レコード 上記の空きで 15:00 ~ 15:30 を予定に入れたら、 14:00 ~ 14:59、15:30 ~ 17:59 に分かれます。 (レコード数=分 でしょうか) (Q1.時刻 Between #8:40# AND #11:59#) は、 (Q1.時刻 >= #8:40# AND Q1.時刻 < #12:00#) の方が考えやすい/指定しやすいかも・・・ 上記を指定して Recordset を得て、グルグル回して、時刻差が 1 分でなかったら 開始の時刻はそのまま・・・ 終了の方は1分加算・・・・ で、求まっていくと思います。 空きの時間帯が複数あっても、グルグル回る時の処理を考えれば良いと思います。 また、どんな時間帯で登録されていようが、求まったものを処理するだけです。 ※ 上記では 1分間隔で「T時刻」内を作成していましたが、入力が 10分単位とかなら、 登録しておく「時刻」も 10分間隔で良いと思います。 グルグル回る時には、時刻差が 10分でなかったら・・・・とか ※ 上記記述をクエリとして作成した場合 保存・閉じた後、再度SQLビューで覗くと ON (Q1.時刻 Between Q2.開始時間 AND DateAdd("n",-1,Q2.終了時間)) 部分は ON Q1.時刻 Between Q2.開始時間 AND DateAdd("n",-1,Q2.終了時間) の様に ( ) が外れます。 編集等しなければ何も影響ありませんが、編集した後保存しようとするとエラーになります。 その時には、消えた ( ) を付け直してください。 (何故なのか・・・・わかりません) ※ 冒頭でも記述しましたが、処理性能は考えてませんので・・・
お礼
ご回答ありがとうございます。 タイムテーブルは考えてなかったですね~。 予定を入力するフォームは5分刻みなので、その間隔で作成しておく ということですね。 ただご指摘の通り、処理能力がどうかというところですね。 空き時間を求めて予定を登録するのですが、実はそこに来るまでにも 少しぐるぐる回る処理をしていまして、使用者に遅いと思われないような くらいならOKですが、ちょっとやってみないと、ですね。 いろいろとたくさん考えていただきましてありがとうございます。 次への経路も見えて助かりました。 ちょくちょく息詰まりますので、また何かありましたらよろしくお願いします。
- nicotinism
- ベストアンサー率70% (1019/1452)
途中までですが・・・ 昼食時間を抜く処理が・・・ 例示された場合だけです・・・。 Sub b() Dim DB As DAO.Database Dim RS As DAO.Recordset Const tS As Date = #8:40:00 AM# Const tE As Date = #6:00:00 PM# Dim tT As Date Dim Ary() As Variant Dim i As Integer Set DB = CurrentDb Set RS = DB.OpenRecordset("SELECT 予定日, [コード], 氏名, 開始時間, 終了時間 FROM New1 ORDER BY 開始時間", dbOpenSnapshot) tT = tS Do Until RS.EOF If tT < RS!開始時間 Then ReDim Preserve Ary(i) Ary(i) = tT & " - " & RS!開始時間 _ & " 空き時間=" & CDate(tT - RS!開始時間) i = i + 1 End If tT = RS!終了時間 RS.MoveNext Loop If tT < tE Then ReDim Preserve Ary(i) Ary(i) = tT & " - " & tE _ & " 空き時間=" & CDate(tT - tE) i = i + 1 End If For i = 0 To UBound(Ary) Debug.Print Ary(i) Next End Sub
お礼
nicotinism 様 ご回答ありがとうございます。 また返信がおそくなりましてすいません。 ご教示いただいた内容ですと、一番最初の開始時間と08:40の差、 次に終了時間と次の予定の開始時間の差、、、と続いて、そして最後の予定の終了時間と18:00の差を 求めればいい。 これに昼食時間を除く処理をかけばいい。 というふうに解釈しましたが、よろしいでしょうか?
お礼
ご回答ありがとうございます。 またご連絡が遅くなり申し訳ありません。 同時進行で他のものも作成しておりましたもので・・・。 おかげさまで空き時間が取得できましたので、まずは一つ解決しました。 昼食時間もアドバイスの感じで二つにわければよさそうです。 ただ、他にも条件がありますのでクリアしなければいけませんが、 ご教示いただいた内容でだいぶ感じがつかめましたので、 なんとかなりそうです。 本当に助かりました。ありがとうございました。 また何かありましたらよろしくお願いします。