3

.NETの DateTime.FromOADateとMS SQL の DateTime へのキャストは同じように機能すると想定しました。

ただし、: 41640
DateTime.FromOADate (値) の戻り値: 2014-01-01
CAST (値AS DATETIME ) の戻り値: 2014-01-03

開始日が異なるため、これは予期された動作ですか、それとも何かが正しくありませんか?

4

4 に答える 4

3

これは、 T-SQL での 2014 年 1 月3 日です。

SELECT CAST(41640 AS DATETIME)  

これは .NET での 2014 年 1 月1 日です。

DateTime dt = DateTime.FromOADate(41640)

理由は MSDN に記載されています。

CAST

「ゼロ」の日付は1900-01-01 です

DateTime.FromOADate

基準日、 1899 年 12 月 30 日午前 0 時

したがって、 と の間には 2 日の違いが 01/01/1900あり12/30/1899ます。

于 2013-09-23T13:53:51.420 に答える
2

これを調査するには、まず基準日を調べる必要があります。

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 日間の違いがあることがわかります。だからこそ、あなたはそのような問題に直面しています。

于 2013-09-23T14:11:04.907 に答える
1

OLE Automation Dates (別名 "OADates") は、COM インターフェイスとの互換性を確保するためのもので、VBA を介して Microsoft Excel などと通信するために使用されます。SQL Server との通信には使用しないでください。クエリでネイティブ SQL datedatetime、またはタイプを返し、 .NET コードで にキャストするだけです。datetime2DateTime

DateTime dt = (DateTime) myDataReader["FooDateTime"];

他の人が述べたように、SQL Server エポックは OLE オートメーション エポックと同じではありません。OLE オートメーションの日付には、負の値を使用した風変わりな動作もあります。また、1900 年 3 月 1 日より前の日付では、使用しているプログラムによってはエポックが使用される12/30/1899場合があります。12/31/1899SQL Server は の固定エポックを使用します1/1/1900

また、多くの Windows および .NET 型と同様に、エポックは UTC に固定されていないため、どのようなコンテキスト タイム ゾーン情報が関係しているかを知る必要があります。(これはDateTime、プロパティに注意を払わないと発生しますが.Kind。)

于 2013-09-23T14:22:16.840 に答える
0

SQL Server の基準日は '19000101' です。0 をキャストしてみてください。

これによると:http: //msdn.microsoft.com/en-us/library/system.datetime.fromoadate.aspx FromOADateは1899-12-30から始まります

于 2013-09-23T14:01:10.207 に答える