C#でMicrofost SQL Serverに書き込みを行う場合、
プログラム側でDateTime.Now
を使って現在の時刻を書き込むのとSQL文にGETDATE()
を入れるのではどちらが処理は速いでしょうか。
又、処理速度以外に留意する事があれば教えて頂けると助かります。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答3件
6
ベストアンサー
これは処理の問題ではなく、「どちらの時計を採用するか」の問題です。
Date.Now() を使う場合は、DB にアクセスしているクライアントの時計が利用されます。つまり「クライアントによって時計がずれる」可能性があります。
一方 GETDATE() はサーバーの時間ですから、どのクライアントから来ても同じ時計であることを保証できます。
Date.Now() の場合、クライアントが複数あると、(マイクロ秒まで見た場合に)本来同一にはならないであろう時刻の値が、同一になってしまう可能性があるのです。
ただ、そこまで厳密に時刻のユニークさを利用することはまずないので、結局は仕様上どちらを使うのが妥当か、という点で落ち着くとは思います。
投稿2019/01/28 01:22
総合スコア13707
2
既に解決積みですが、留意するべき点として一番ハマり易い精度の違いを挙げておきます。
GETDATE()はT-SQLのdatetime型なので、ミリ秒までかつ、ミリ秒桁が 0,3,7 の3つの値しか取れません。
一方、.NetのDateTime型はマイクロ秒まであります。
.NetのDateTime型を、T-SQLのdatetime型保存すると丸められます。
また、データープロバイダによる変換誤差も度々発生します。
これらによる不具合は、枚挙にいとまがありません。
.Netと相互運用する場合は、マイクロ秒以上の精度があるdatetime2か日付までしか扱えないdate型だけを使い
datetimeを使わないようにすると、多くの不具合を未然に防げます。
投稿2019/01/28 01:57
総合スコア4152
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

2
又、処理速度以外に留意する事があれば教えて頂けると助かります。
時間の粒度が細かい場合、どのマシンで時間を取るか一貫させる必要があります。
時計をNTPなどで合わせていることを前提としても、ミリ秒オーダーの差はできてしまうので、どのマシンで時間を取るかがずれれば、前後の順番が逆転するなどよろしくない事態が起きる危険があります。
投稿2019/01/28 01:18
総合スコア146605
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/01/28 01:43