牛、豚、鶏、どれか一つ食べられなくなるとしたら?

毎日9時にmdbを自動作成しています。
mdbの中身は1分毎のレコードが作成されており、1日分なので1440レコードが存在しています。
該当する時間になると、数量フィールドに1分毎に値を書き込んでいます。

日時はテキスト型、他は数値型です。
日時フィールドは、mmddhhmm形式です。


日時                       数量
04010900                     0
04010901                    500
04010902                    500
04010903                     0
04010904                     0
04010905                     500
04010906                     500
04010907                      0
04010908                    500
04010909                    500
04010910                      0

動き出した時間を抽出したく、
数量が0の後に、数量へ1以上の値が書き込まれているレコードを1発で抽出したいのですが、可能でしょうか?

上の例ですと
04010901                     500
04010905                    500
04010908                    500

のレコードだけを抽出したいです。


SELECT テーブル名.日時, テーブル名.数量
FROM テーブル名
WHERE (((テーブル名.数量)<>0));

の、SQL文で0を弾いてみたのですが、0以外の全ての値が抽出されてしまっています。
いい抽出条件があれば教えてください、お願いします

A 回答 (2件)

直接的な回答にはなりませんが



> 毎日9時にmdbを自動作成しています。
> 1日分なので1440レコードが存在しています。

翌日の 8:59 までの日時の形式はどうなっているのでしょうか?
先日のご質問

並び替えているレコードの抽出方法
http://oshiete.goo.ne.jp/qa/8947188.html

を継承しているのなら、前後関係は単純には出来ないと思います。

mdb を作られている=フィールドの追加は容易?ならば
連番用のフィールドを追加される事をお勧めします。

例えばの1)

日時   分番 数量
04010900  0  0
04010901  1  500
04010902  2  500
04010903  3  0
04010904  4  0
04010905  5  500
04010906  6  500
04010907  7  0
04010908  8  500
04010909  9  500
04010910  10  0

この時の分番は、9:00 起点とすると

Public Function MinuteNumber() As Long
  Dim i As Long
  Dim s As String
  Const CT As String = "1/1 9:00"
  Const CDT1 As String = "1/1 {%1}"
  Const CDT2 As String = "1/2 {%1}"

  s = Format(Now, "hh:nn")
  If (s >= "09:00") Then
    i = DateDiff("n", CT, Replace(CDT1, "{%1}", s))
  Else
    i = DateDiff("n", CT, Replace(CDT2, "{%1}", s))
  End If
  MinuteNumber = i
End Function

Public Sub test()
  Debug.Print MinuteNumber
End Sub

で求める事が出来るので、データ登録時に埋め込んでおきます。
この状況で、分番を使用してクエリを作成すると
(テーブル名を ★★ と仮定)

SELECT 日時, 数量 FROM ★★ AS Q1 WHERE
数量>0 AND NOT EXISTS
(SELECT 1 FROM ★★ WHERE 数量>0 AND 分番=Q1.分番-1);

この表示が求めたいものになるかと

※ 順を示す用途の連番が必要なだけなので、作り方は自由です


例えばの2)

日時   分番 数量
04010900  0  0
04010900  1  500
04010900  2  500
04010900  3  0
04010900  4  0
04010900  5  500
04010900  6  500
04010900  7  0
04010900  8  500
04010900  9  500
04010900  10  0

日時には起点となる文字列を入れておきます。
実際の日時は、日時+分番

Public Function MNum2Date(vS As Variant, iNum As Long) As String
  Dim s As String

  If (VarType(vS) <> vbString) Then Exit Function
  s = Format(vS, "@@/@@ @@:@@")
  MNum2Date = Format(DateAdd("n", iNum, s), "mmddhhnn")
End Function

を用意しておいて、クエリでは
(テーブル名を ▲▲ と仮定)

SELECT MNum2Date(Q1.日時,分番) AS 日時, 数量
FROM ▲▲ AS Q1 WHERE
数量>0 AND NOT EXISTS
(SELECT 1 FROM ▲▲ WHERE 数量>0 AND 分番=Q1.分番-1);

これでも求めたいものになるかと


テーブルを設計する時には、
・貯めたデータを
・どの様な条件で
・速く抽出できるか

速く抽出したいので、その条件となるものを、貯める時に作り込む・・・だと思います
日付 2015/4/2 そのものを入れるフィールドがあって、
抽出条件には 月 しか使わないのなら、月用のフィールドを設けて埋め込んでおくのも「あり」と思います。
    • good
    • 1

こちらが参考になりそうです。


ゼロ と ゼロ以外 の違いだけですから。

http://okwave.jp/qa/q8882323.html
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!