.NETの DateTime.FromOADateとMS SQL の DateTime へのキャストは同じように機能すると想定しました。
ただし、値: 41640
DateTime.FromOADate (値) の戻り値: 2014-01-01
CAST (値AS DATETIME ) の戻り値: 2014-01-03
開始日が異なるため、これは予期された動作ですか、それとも何かが正しくありませんか?
.NETの DateTime.FromOADateとMS SQL の DateTime へのキャストは同じように機能すると想定しました。
ただし、値: 41640
DateTime.FromOADate (値) の戻り値: 2014-01-01
CAST (値AS DATETIME ) の戻り値: 2014-01-03
開始日が異なるため、これは予期された動作ですか、それとも何かが正しくありませんか?
これは、 T-SQL での 2014 年 1 月3 日です。
SELECT CAST(41640 AS DATETIME)
これは .NET での 2014 年 1 月1 日です。
DateTime dt = DateTime.FromOADate(41640)
理由は MSDN に記載されています。
「ゼロ」の日付は1900-01-01 です
基準日、 1899 年 12 月 30 日午前 0 時
したがって、 と の間には 2 日の違いが 01/01/1900
あり12/30/1899
ます。
これを調査するには、まず基準日を調べる必要があります。
MSSQL では次のprint CAST(0 AS DATETIME)
ように出力されます。
1900 年 1 月 1 日 午前 12:00
C# .Net では次のConsole.WriteLine(DateTime.FromOADate(0));
ように出力されます。
1899/12/30 12:00:00 午前
したがって、2 つの基準日の間に2 日間の違いがあることがわかります。だからこそ、あなたはそのような問題に直面しています。
OLE Automation Dates (別名 "OADates") は、COM インターフェイスとの互換性を確保するためのもので、VBA を介して Microsoft Excel などと通信するために使用されます。SQL Server との通信には使用しないでください。クエリでネイティブ SQL date
、datetime
、またはタイプを返し、 .NET コードで にキャストするだけです。datetime2
DateTime
DateTime dt = (DateTime) myDataReader["FooDateTime"];
他の人が述べたように、SQL Server エポックは OLE オートメーション エポックと同じではありません。OLE オートメーションの日付には、負の値を使用した風変わりな動作もあります。また、1900 年 3 月 1 日より前の日付では、使用しているプログラムによってはエポックが使用される12/30/1899
場合があります。12/31/1899
SQL Server は の固定エポックを使用します1/1/1900
。
また、多くの Windows および .NET 型と同様に、エポックは UTC に固定されていないため、どのようなコンテキスト タイム ゾーン情報が関係しているかを知る必要があります。(これはDateTime
、プロパティに注意を払わないと発生しますが.Kind
。)
SQL Server の基準日は '19000101' です。0 をキャストしてみてください。
これによると:http: //msdn.microsoft.com/en-us/library/system.datetime.fromoadate.aspx FromOADateは1899-12-30から始まります