3

SQL データベースからデータを取得しています。Int 型に変換する必要がある日付の列がいくつかありますが、これを行うと日付が変わります (-2 日)。Cast と Convert を試しましたが、常に同じです。他の型への変換は正常に機能し、正しい日付を返しますが、私にはうまくいきません。datetime の日付部分だけが必要で、Excel で日付として認識される必要があります。

なぜこうなった?それをソートする方法はありますか?

次のクエリを使用しています。

SELECT wotype3, CONVERT(INT,wo_date2 ,103), CAST(duedate AS int) FROM Tasks WHERE 
duedate > DATEADD(DAY,1, GETDATE()) 
AND wo_date2>0
AND wo_date2<DATEADD(WEEK,3,GETDATE())
ORDER BY wotype3
4

2 に答える 2

3

これには大きな問題があり、ユーザーが Excel を使用して作成した「期待される結果」で SQL Server の計算結果を確認していました。

この 2 日間の日付の違いだけで、不一致が発生しました。

なぜそれが起こるのですか?

2 つの理由:

  1. SQL Server は1900 年 1 月 1 日からゼロベースの日付カウントを使用しますが、Excel は 1900 年 1 月 1 日から 1 ベースの日付カウントを使用します。

  2. Excel にはバグがあり (あえぎ!)、1900 年がうるう年であると認識してしまいます。そうではありませんでした。SQL Server は、" " を含む日付値を持つことを正しく拒否します29-Feb-1900

ここに画像の説明を入力

これら 2 つの不一致を組み合わせると、1900 年 3 月 1 日以降のすべての日付が常に 2 日ずれているのはこのためです。

どうやら、この Excel のバグは既知の問題であり、Lotus 1-2-3 に沿ったものになっています。

意図的な日付バグ

マイクロソフト独自の説明

これからは、同じ言い訳でコードのバグを正当化すると思います。

;-)

于 2014-08-13T12:50:37.900 に答える
1

SQL Server 2008 以降では、DATE データ型を使用できます。

declare @dt datetime = '12/24/2013 10:45 PM'  -- some date for example
SELECT @dt as OriginalDateTime, CAST(@dt as DATE) as OnlyDate

SQL Server 2008 より前のバージョンでは、いずれかの関数を使用して時刻部分を切り捨てる必要があります。これを行う1つの方法は次のとおりです。

declare @dt datetime = '12/24/2013 10:45 PM'  -- some date for example
SELECT @dt as OriginalDateTime, CAST(FLOOR(CAST(@dt AS FLOAT)) as DATETIME) as OnlyDate
于 2013-09-24T12:27:13.347 に答える