web-dev-qa-db-ja.com

.NET DateTimeからSqlDateTimeへの変換

.NET DateTime(when is default(DateTime))をSqlDateTimeに変換する際、.NET日付がSqlDateTime.MinValueとSqlDateTime.MaxValueの間にあるかどうかを常に確認する必要があります[または]これを行う良い方法はありますか。

50
Sreedhar

日付が実際にその範囲外になる可能性はありますか?ユーザー入力から来ていますか?これらの質問のいずれかに対する答えが「はい」の場合、常に確認する必要があります。そうしないと、アプリケーションがエラーになりやすくなります。

SQLステートメントに含めるために、日付をかなり簡単にフォーマットできます。

var sqlFormattedDate = myDateTime.Date.ToString("yyyy-MM-dd HH:mm:ss");
93
Winston Smith

DBNULLをチェックしている場合、SQL Datetimeを.NET DateTimeに変換しても問題はありません。ただし、.NET DateTimeを有効なSQL DateTimeに変換する際に問題が発生する可能性があります。

SQL Serverは、1751年1月1日より前の日付を認識しません。それはイギリスがグレゴリオ暦を採用した年です。通常、DateTime.MinValueのチェックで十分ですが、データに18世紀よりも前の年があると思われる場合は、別のチェックを行うか、別のデータ型を使用する必要があります。 (私はしばしば、博物館がデータベースで何を使用しているのだろうと思います)

最大日付の確認は実際には必要ありません。SQLServerと.NET DateTimeの最大日付は12/31/9999です。有効なビジネスルールである可能性がありますが、問題は発生しません。

2
fremis

entitieでこれを行うための探求で、私はここで偶然見つけました。

eF4を使用する場合、BitConverterを使用して.NETのDateTimeから "sql"のdatetime列に入力できます。

EntitieObj.thetime = BitConverter.GetBytes(DateTime.Now.ToBinary());

また、Fakrudeenのリンクは私をさらに連れてきました...ありがとう。

1
womd

また、解像度[時間の量]は異なることを覚えておいてください。

http://msdn.Microsoft.com/en-us/library/system.data.sqltypes.sqldatetime.aspx

SQL 1は3.33ミリ秒で、.net 1は100 nsです。

1
Fakrudeen

-日付部分のみを比較するには、次を実行できます。

var result = db.query($"SELECT * FROM table WHERE date >= '{fromDate.ToString("yyyy-MM-dd")}' and date <= '{toDate.ToString("yyyy-MM-dd"}'");
0
christianb35