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"
一括して更新する方法が分かりません。
分かる方ご教授願います。
update list set 経過時間 = datediff( 'h',開始時間,終了時間);
こんなんでどうでしょ?
初心者掲示板に書くならかわいげもあるけれど言語に依存しないよね?
SQLの質問は、そもそもVBの掲示板に聞くのではなく、
しかるべきところで聞いてみてはいかが?
Sさま ありがとうございます。
試したところ”コンパイルエラー修正候補:ステートメントの最後”と返されてきたので、ご意見を参考にいろいろと試してみます。
h.iさま
こちらでの質問は適切でないとのご指摘について承知しました。
コンパイルエラーとの事なのですが
sql = "update list set 経過時間 = datediff( 'n',開始時間,終了時間);"
を単純にExecuteSQLすればいいのではないでしょうか?
AdoObj.ExecuteSQL(sql)
こうかな?
# 'h'は'n'の間違いです。
#少しSQLより?になってしまったようで申し訳ないです。
s様
ありがとうございます。コンパイルエラーの件ですが、ご指導どおり
ExecuteSQLを忘れていましたので、追加してやってみました。
エラーはでなくなったのですが、残念ながら経過時間の値は更新されません。
ところで、複数レコードの異なる「開始時間」「終了時間」からdatediff関数を使って、それぞれの経過時間に一括して更新することはそもそもできるのでしょうか?
または、1レコードごとの処理にしなくてはいけないですか?
超初歩的な質問ですみません。それもSQLのことで。
>それぞれの経過時間に一括して更新することはそもそもできるのでしょうか?
私が質問を勘違いしていなければ可能です。
一レコードずつ処理する必要は無いはずです。
Access起動して対象のMDBを開き、新規クエリでSQLを入力して
実験してみてはどうでしょう?
SELECT datediff( 'n',開始時間,終了時間) FROM list ;
で期待した答えが出てくるか?
update list set 経過時間 = datediff( 'n',開始時間,終了時間);
した時に経過時間が入っているか?
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の話で・・
>は、SELECT のあとがフィールド名でないのでうまくいきません。
認識が間違っています。
もしかして、開始時間、終了時間はchar型ですか?
正しい変換をしてみてください。(Date型で試したらうまく出来ました)
CDateで変換してみては?
#私はあまり気にしていませんが、
#型変換も含めてAccess系の掲示板で聞いてみるのも
#いいかもしれません。
s様
根気よくお付き合いいただき感謝いたします。
型はDate型なのですが、ブレークポイントを設定して確認したところ、
>update list set 経過時間 = datediff( 'n',開始時間,終了時間);
の開始時間と終了時間の中身はともにEmpty値となっていました。
そのため経過時間の値は、0ゼロとなっていたようです。
※このままだと、SQLに限らずAccessの話に進んでおりますので
ご助言通りにAccess系の掲示板で聞くことを検討したいと思います。
試してみました。
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")),
s様
ご指導のとおりに試したらうまくいき、みごと経過時間が出てきました。
気づいたこととして、教えていただいたDatediff('n',●,●)の時間単位の部分について、当初の"n" を 'n'に変えてみましたらゼロでない値が返ってくるようになりました。
なぜか理由は分かりませんが、問題は解決しました。
本当にありがとうございました。
>なぜか理由は分かりませんが、問題は解決しました。
http://www.confrage.com/oracle/oracle_sql/basis/word/word.html
基本なのでこの辺は分からないままにしておくとダメです。
ありがとうございました。
改めて基本の部分はきちんと勉強しなおしたいと思います。
今回のご指導重ねて御礼申し上げます。