3

とりわけ、日付を保存および表示できる汎用ツールがあります。41247 などの数値として保存されます。

これを Access の日付に戻すと、2012/12/04 になります。これは正しいです。
[Format(41247;"General Date") または Format(Format("41247", "Short Date"), "Short Date") を使用]

その数値を SQL Server の日付に戻すと、2012/12/06 になります - 正しくありません。私は CONVERT(datetime, CONVERT(real, 41247)) を使用しています

なぜ違いがあり、それを修正するために SQL で何を使用できますか?

4

2 に答える 2

6

そのため、Excel ファイルからデータをインポートするときにこの問題が発生しました。

2日間の違いがある理由は2つあります

理由 1 SQL Server では 1900 年 1 月 1 日が 0 日目ですが、アクセスでは 1 日目です。

(私は Access を使用していませんが、Excel に 1900-01-01 という日付を入力し、セルを数値として書式設定すると、1 が得られます)。

理由 2 1900 年はうるう年ではありませんでした。SQL Server はそれを認識していますが、Access は認識していません。1900 年 2 月 29 日が存在したと考えられます。

これを SQL Server で実行します

SELECT DATEDIFF(dd, 0, '1900-01-01')
SELECT DATEDIFF(dd, 0, '1900-02-28')
SELECT DATEDIFF(dd, 0, '1900-03-01')

出力は次のようになります。

0
58 
59

でも走ろうとすると

SELECT DATEDIFF(dd, 0, '1900-02-29')

エラーが発生します

The conversion of a varchar data type to a datetime data type resulted in an out-of-range value.

これらの 2 つの理由により、アクセスが 2 日多くなります。

したがって、2012/12/04 の場合、Access は 41247 を返しますが、SQL Server は 41245 を返します。

それが役に立ったことを願っています。

編集

Eric Lippert のコメントを見てください。彼と Joel Spolsky による 2 つの非常に興味深いブログ投稿について言及しています。

于 2013-05-07T15:28:51.800 に答える
2

2 つの異なるデータベース エンジンが同じ内部数値形式を使用して日付を保存するという保証はまったくありません。したがって、期待するのは合理的ではありません...

  • アクセス日時の値を取得し、

  • それを Access の同等の数値に変換してから、

  • その数値を SQL Server の日時値に変換します

...日付が一致することが保証されます。

データベース環境間で日時値を渡す必要がある場合は、明確な文字列など、両方に共通の形式で渡す必要があります。(私がその問題に直面した場合、XML が使用する日付/時刻形式のようなものを試してみたくなるでしょう。)

編集

@roughnex からの非常に有益な回答に関しては、Access の日付番号から 2 を引いて SQL Server の日付番号を取得するのは非常に魅力的かもしれません (<=58 でない限り、この場合は 1 を引くだけです)。あまり良い考えではありません。理由については、次のブログ エントリを参照してください。

虫の心理学 - Eric Lippert

このようなショートカットは、一見奇妙な動作につながる可能性があり、後で開発者 (およびユーザーも) の損耗を大幅に増加させる可能性があります。

于 2013-05-07T15:11:11.100 に答える