質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.30%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

3回答

4475閲覧

DateTime.NowとGETDATE()どちらが速いか

otftrough

総合スコア477

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2019/01/28 01:09

C#でMicrofost SQL Serverに書き込みを行う場合、
プログラム側でDateTime.Nowを使って現在の時刻を書き込むのとSQL文にGETDATE()を入れるのではどちらが処理は速いでしょうか。
又、処理速度以外に留意する事があれば教えて頂けると助かります。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

6

ベストアンサー

これは処理の問題ではなく、「どちらの時計を採用するか」の問題です。

Date.Now() を使う場合は、DB にアクセスしているクライアントの時計が利用されます。つまり「クライアントによって時計がずれる」可能性があります。
一方 GETDATE() はサーバーの時間ですから、どのクライアントから来ても同じ時計であることを保証できます。

Date.Now() の場合、クライアントが複数あると、(マイクロ秒まで見た場合に)本来同一にはならないであろう時刻の値が、同一になってしまう可能性があるのです。

ただ、そこまで厳密に時刻のユニークさを利用することはまずないので、結局は仕様上どちらを使うのが妥当か、という点で落ち着くとは思います。

投稿2019/01/28 01:22

tacsheaven

総合スコア13707

Zuishin, otftrough, trick, ronin, maisumakun, poniponiponiki👍を押しています

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otftrough

2019/01/28 01:43

私の考え方が根本的におかしかった事ががよくわかりました。 ありがとうございます。
guest

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

hihijiji

総合スコア4152

otftrough, maisumakun👍を押しています

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otftrough

2019/01/28 02:03

ありがとうございます。 マイクロ秒まで使う事は滅多にありませんが頭に入れておきます。
hihijiji

2019/01/28 02:21

> マイクロ秒まで使う事は滅多にありません 秒以上しか使わないから大丈夫だと思いました? ところがギッチョン、この問題は、秒以上しか使わなくても引っかかるのです。 http://blog.kotemaru.org/2013/03/30/SQLServer-timedate.html https://ameblo.jp/hiro628/entry-10318105667.html https://www.ilovex.co.jp/Division/ITD/archives/2007/06/sqlserver_datet.html 根底は、精度違いによる丸め誤差と変換誤差なのです。
guest

2

又、処理速度以外に留意する事があれば教えて頂けると助かります。

時間の粒度が細かい場合、どのマシンで時間を取るか一貫させる必要があります。

時計をNTPなどで合わせていることを前提としても、ミリ秒オーダーの差はできてしまうので、どのマシンで時間を取るかがずれれば、前後の順番が逆転するなどよろしくない事態が起きる危険があります。

投稿2019/01/28 01:18

maisumakun

総合スコア146605

mpyw, otftrough👍を押しています

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問