Excel からの形式がわかっている場合は、特定の IFormatterProvider を使用して C# で文字列を DateTime に解析するのが最適です。
ここでの問題は、Excel からの文字列に関するカルチャ情報がないため、DateTime への変換ではデータベースのカルチャ (この場合は月と日を逆にする形式) しか考慮できないことです。これは、範囲外の日付 (あなたの場合のように) またはあいまいな日付が正しく解析されないことを意味します。
C# コードでは、を実装するカルチャを指定できますIFormatterProvider
。en-GB には、指定した Excel 日付の日付形式があります。MSDN ドキュメントの例は、これを行う方法を示しています。DateTime
私のブリーフィング例では、en-GB 日付形式の文字列を文化に依存しない形式に変換する方法を示しています。
var culture = CultureInfo.CreateSpecificCulture("en-GB");
var date = DateTime.Parse("13/12/2011", culture);
SQL は文化に関して同じ問題を抱えています。カルチャに依存するデータの文字列表現は、常に現在のカルチャを失います。そのデータを変換するときに、サーバーと異なる場合はカルチャを指定する必要があります。
これを SQL で実行し、変換しようとしている文字列の形式をハードコーディングできます (103 は en-GB の日付形式 dd/mm/yyyy を表します)。
declare @datestring varchar(10) = '13/12/2011' --13th December
-- 103 is the format code for UK dates with full yyyy century.
select convert(date, @datestring, 103) --gives 2011-12-13
declare @datestring2 varchar(10) = '05/04/2011' --5th April, ambiguous date.
select convert(date, @datestring2, 103) --gives 2011-04-05
フォーマットコードを変換/キャストします。
これは、カルチャが不明な場合に月/日を逆にする 05/04/2011 などのあいまいな日付も正しく変換することにも注意してください。
たとえば、パーサーに形式を指定せずに英国の 2011 年 4 月 5 日を米国の日付に変換しようとすると、月と日が逆になり、2011 年 5 月 4 日が出力されます。