たとえば、MSSQLServer2008 の列に datetime データ型を設定して datecreated を取得する場合、.NET レイヤーに現在の日付を渡すか、列のデフォルト値またはバインディングを (getdate()) に設定する方がよいでしょうか?
4 に答える
そのような項目の日付をSQLサーバーに処理させる方が良いと思います。クライアントが日付を渡す場合、クライアントが異なるタイムゾーンにある場合、または1つのクライアントのマシンに間違った日付が設定されている場合、問題が発生する可能性があります。さらに、コマンドで送信する必要のあるアイテムが1つ少なくなります。
私の見解では、方法が一貫している限り、どこでそれを行ってもそれほど違いはありません。
パフォーマンスや保守性の面で大きな違いがあるとは思えません。
私の好みはgetdate()を使用してデータベースに作成することですが、これによりORMを使用するときにパスで問題が発生しました。
サーバーの現地時間ではなく、UTC で時刻を記述することを検討する必要があります。このようにして、サーバーをあるタイムゾーンから別のタイムゾーンに移動する必要がある場合、問題はありません.
例として、サーバーをテキサスからカリフォルニアに移動しています。メインの本番アプリは、すべての日時値に UTC 時間を使用します。ただし、発券システムはサーバー時間を使用し、発券アプリは、サーバーがテキサスにあると仮定して、値をユーザーの現地時間に変更します。サーバーをカリフォルニアに移動すると、すべてが非常に混乱し、値がすべて 2 時間ずれます。
GETDATE() のデフォルト値でその列を作成しますが、ストアド プロシージャに実際の値を設定させます。 すべての列を含まない INSERT ステートメントを使用するのは悪い習慣だと思います。
必要に応じて、トランザクションの開始時に変数 @RunDate を GETDATE() に設定し、すべての CreateDate 列と LastChgDate 列を @RunDate でマークします。私は主キーに日付を使用したことがないので、多少ずれていても問題ありません。ユーザーが作成/変更したすべてのものを同時に見る方が良いと思います。