一括して更新するSQLは

解決


ぺったん  2008-07-23 08:34:00  No: 100913  IP: 192.*.*.*

VB6  ADO接続
MDBテーブル名listに「開始時間」「終了時間」がすでに入っています。
「経過時間」はいま""の状態です。
「経過時間」に「開始時間」から「終了時間」の時間差を値として一括して更新するSQLを教えてください。

ID  l氏名  l開始時間  l終了時間  l経過時間  l
0001  l鈴木  l2008/07/23 09:10:32  l2008/07/23 19:05:12  l l
0002  l山田  l2008/07/23 09:12:18  l2008/07/23 18:23:02  l l
0002  l田中  l2008/07/23 09:11:15  l2008/07/23 18:30:34  l l

*IDをキーにしてレコード毎に[経過時間]をDateDiffステートメントで値を更新していくことはできるのですが、
Dim wtime
wtime = Datediff ("n",format(time,"h:n"),format(time2,"h:n")),
sql = "update list set [経過時間] = " & wtime & " where ID = "0001"

一括して更新する方法が分かりません。
分かる方ご教授願います。

編集 削除
s  2008-07-23 10:02:50  No: 100914  IP: 192.*.*.*

update list set 経過時間 = datediff( 'h',開始時間,終了時間);

こんなんでどうでしょ?

編集 削除
h.i  2008-07-23 16:59:19  No: 100915  IP: 192.*.*.*

初心者掲示板に書くならかわいげもあるけれど言語に依存しないよね?
SQLの質問は、そもそもVBの掲示板に聞くのではなく、
しかるべきところで聞いてみてはいかが?

編集 削除
べったん  2008-07-23 20:25:39  No: 100916  IP: 192.*.*.*

Sさま  ありがとうございます。
試したところ”コンパイルエラー修正候補:ステートメントの最後”と返されてきたので、ご意見を参考にいろいろと試してみます。
h.iさま
こちらでの質問は適切でないとのご指摘について承知しました。

編集 削除
s  2008-07-24 21:50:26  No: 100917  IP: 192.*.*.*

コンパイルエラーとの事なのですが
sql = "update list set 経過時間 = datediff( 'n',開始時間,終了時間);"
を単純にExecuteSQLすればいいのではないでしょうか?

AdoObj.ExecuteSQL(sql)

こうかな?

# 'h'は'n'の間違いです。
#少しSQLより?になってしまったようで申し訳ないです。

編集 削除
べったん  2008-07-27 19:07:38  No: 100918  IP: 192.*.*.*

s様
ありがとうございます。コンパイルエラーの件ですが、ご指導どおり
ExecuteSQLを忘れていましたので、追加してやってみました。
エラーはでなくなったのですが、残念ながら経過時間の値は更新されません。
ところで、複数レコードの異なる「開始時間」「終了時間」からdatediff関数を使って、それぞれの経過時間に一括して更新することはそもそもできるのでしょうか?
または、1レコードごとの処理にしなくてはいけないですか?
超初歩的な質問ですみません。それもSQLのことで。

編集 削除
s  2008-07-27 19:37:22  No: 100919  IP: 192.*.*.*

>それぞれの経過時間に一括して更新することはそもそもできるのでしょうか?
私が質問を勘違いしていなければ可能です。
一レコードずつ処理する必要は無いはずです。


Access起動して対象のMDBを開き、新規クエリでSQLを入力して
実験してみてはどうでしょう?

SELECT datediff( 'n',開始時間,終了時間)  FROM list ;
で期待した答えが出てくるか?

update list set 経過時間 = datediff( 'n',開始時間,終了時間);
した時に経過時間が入っているか?

編集 削除
べったん  2008-07-27 21:49:34  No: 100920  IP: 192.*.*.*

s様
早速にありがとうございます。MDBを確認しながら試していますが、
>SELECT datediff( 'n',開始時間,終了時間)  FROM list ;  
は、SELECT のあとがフィールド名でないのでうまくいきません。
>update list set 経過時間 = datediff( 'n',開始時間,終了時間);
これを実行するとMDBの[経過時間]フィールドには、0(ゼロ)が入ります。
なぜゼロが返ってくるかが解決のカギのように思えます。
datediffの引数にフィールド名をそのまま入れることに無理があるのでしょうか?
>update list set 経過時間 = datediff('n',format(開始時間,"h:n"),format(終了時間,"h:n"));
としても「型が一致しません」とうまくいきませんでした。
※すみません。SQLの話で・・

編集 削除
s  2008-07-28 22:36:08  No: 100921  IP: 192.*.*.*

>は、SELECT のあとがフィールド名でないのでうまくいきません。
認識が間違っています。

もしかして、開始時間、終了時間はchar型ですか?
正しい変換をしてみてください。(Date型で試したらうまく出来ました)
CDateで変換してみては?

#私はあまり気にしていませんが、
#型変換も含めてAccess系の掲示板で聞いてみるのも
#いいかもしれません。

編集 削除
べったん  2008-07-28 23:32:31  No: 100922  IP: 192.*.*.*

s様
根気よくお付き合いいただき感謝いたします。

型はDate型なのですが、ブレークポイントを設定して確認したところ、
>update list set 経過時間 = datediff( 'n',開始時間,終了時間);
の開始時間と終了時間の中身はともにEmpty値となっていました。
そのため経過時間の値は、0ゼロとなっていたようです。

※このままだと、SQLに限らずAccessの話に進んでおりますので
ご助言通りにAccess系の掲示板で聞くことを検討したいと思います。

編集 削除
s  2008-07-29 10:28:06  No: 100923  IP: 192.*.*.*

試してみました。

TABLE list
ID        オートナンバー
開始時間  日付/時刻型
終了時間  日付/時刻型
経過時間  数値型

テストデータ
ID      開始時間              終了時間               経過時間
1       2008/05/10 10:10:00   2008/06/10 13:10:00    0
2       2008/06/10 12:00:00   2008/06/10 13:00:00    0


Private Sub Form_Load()
    Dim ado_db As adodb.Connection
    Set ado_db = CreateObject("ADODB.Connection")
  
    ado_db.Open "DSN=ADO_TEST"  ' ADO_TESTは自前で登録
    ado_db.Execute ("UPDATE list SET 経過時間 = datediff('n',開始時間,終了時間);")
    ado_db.Close
    End
End Sub


実行結果
ID      開始時間              終了時間               経過時間
1       2008/05/10 10:10:00   2008/06/10 13:10:00    44820
2       2008/06/10 12:00:00   2008/06/10 13:00:00    60


こういうことをしたいのでは?
であれば、プロジェクトも新規作成
テーブル構成もまるっきり同じにして試してみては
どうでしょう?


#なんとなく最初のこの辺の質問から抜け出せていないような気が。。
#Dim wtime
#wtime = Datediff ("n",format(time,"h:n"),format(time2,"h:n")),

編集 削除
べったん  2008-07-29 17:20:42  No: 100924  IP: 192.*.*.*

s様
ご指導のとおりに試したらうまくいき、みごと経過時間が出てきました。
気づいたこととして、教えていただいたDatediff('n',●,●)の時間単位の部分について、当初の"n" を 'n'に変えてみましたらゼロでない値が返ってくるようになりました。
なぜか理由は分かりませんが、問題は解決しました。
本当にありがとうございました。

編集 削除
s  2008-07-29 22:33:15  No: 100925  IP: 192.*.*.*

>なぜか理由は分かりませんが、問題は解決しました。

http://www.confrage.com/oracle/oracle_sql/basis/word/word.html
基本なのでこの辺は分からないままにしておくとダメです。

編集 削除
べったん  2008-07-30 01:02:07  No: 100926  IP: 192.*.*.*

ありがとうございました。
改めて基本の部分はきちんと勉強しなおしたいと思います。
今回のご指導重ねて御礼申し上げます。

編集 削除