SQL Server 2005 とASP.net の日時形式の混乱
-
02-07-2019 - |
質問
スタック オーバーフローに関する同様の質問を見つけましたが、私の質問に対する答えはありませんでした。asp.net アプリケーションが日付 dd/mm/yyyy を SQL Server 2005 と同じ形式に設定していることを確認する必要があります。
サーバーの日付カルチャ (そう呼ばれている場合) がアプリのプログラミング方法と一致していることを確認するにはどうすればよいですか?特定のデータベース設定や OS 設定はありますか?テーブル固有ですか?自分の日や月を置き換えたくありません。
ありがとう
解決
データベースから DateTime を取得する場合、それは非カルチャ形式 (特定の日付以降のティック数に基づく DateTime オブジェクトなど) である必要があります。カルチャに注意する必要があるのは、値を文字列に変換する場合のみです。このような場合、yourDateTimeValue.ToString("dd/MM/yyyy", CultureInfo.InvariantCulture) を使用して、情報が正しく表示されることを確認できます。
他のヒント
SqlParameters を使用すれば、残りの部分は ADO.NET が処理してくれるので、心配する必要はないと思います。さらに、SQL インジェクション攻撃に対する防御にも役立ちます。:)
** SQL DateTime 列は NULL 非許容であり、その最小値は 1/1/1753 ですが、.net DateTime は NULL 非許容で最小値は 1/1/0001 であるため注意してください。**
実際の DateTime 列からデータを取得する場合、デフォルトでは常に同じ標準形式になります。データを列に保存するには、パラメーターで SqlDbType.DateTime を指定することができます。
これを剥ぎ取った http://bytes.com/forum/thread767920.html :
com.Parameters.Add("@adate", SqlDbType.DateTime).Value = DateTime.Now;
DB に日時フィールドを保持している場合は、心配する必要はありません。
アプリ内の日付を厳密に型指定し (DateTime 変数) 保持し、DBParameter/SqlParameter を使用して準備されたステートメントを通じて日付を送信する限り、DB は日付をそのまま受け取ります。
文字列を使用してコード内で日付を保持する場合、いくつかのキャストによって正しい値が確実に送信されます。
string sqlCmd = @"SELECT *
FROM MyTable
WHERE MyDateField = CONVERT(datetime, '{0}', 101)";
// assuming myDateString is a string with a date in the local format
sqlCmd = string.Format(sqlCmd,
Convert.ToDateTime(myDateString).ToString("yyyyMMdd"));
(コードは醜いですが、要点が伝われば幸いです)
他の人が述べたように、日時を文化的に保存する限りは問題ないはずです。私がお勧めするのは、すべての時間を標準 UTC 時間として保存することです。SQL Server 2005 以前ではタイム ゾーン情報を保存する方法はありませんが、すべてが世界時で保存されていれば、後で現地時間に変換できるため問題ありません。
SQL Server 2008 にはタイム ゾーンを認識するデータ型がいくつかあります。また、.NET 3.5 を使用している場合は、タイム ゾーンの処理/変換を支援するツールがあります。
時刻は必ず普遍的な形式で記録してください。複数のタイムゾーンで作業する必要がある場合、これにより大きな違いが生じます。