2

SQL Server (2005) がこの ISO 8601 形式の日付を誤って解釈するのはなぜですか? (YYYY-MM-DD)

DECLARE @FromDate DATETIME
SET @FromDate = '2013-01-05'
PRINT @FromDate
-- Prints: May  1 2013 12:00AM

テキスト形式の日付は明らかに 1 月 5 日ですが、何らかの理由で SQL Server が 5 月 1 日と解釈しています。世界には YYYY-DD-MM という日付形式がないのに、なぜこれが起こっているのですか? 私はこの形式を何年も使用してきましたが、これまで問題が発生したことは一度もなかったので、この場合の違いはわかりません.

CONVERT を使用して ISO8601 に強制しても、まだ間違っています。

DECLARE @FromDate DATETIME
SET @FromDate = CONVERT(VARCHAR, '2013-01-05', 126) 
PRINT @FromDate
-- Still prints: May  1 2013 12:00AM

編集:おっと-私は本当にCONVERT(DATETIME)を意味するところに「CONVERT(VARCHAR」を使用しているため、効果がありませんでした。ありがとう@RBarryYoung

ただし、上記の 2 つの例のいずれかを別のサーバー (SQL 2012) で実行すると、どちらも「2013 年 1 月 5 日 12:00AM」と正しく出力されます。

ここで何が起こっているのですか?SQL Server で ISO 形式を使用する主な理由の 1 つは、月と日が明確になるためだと思いました。

4

1 に答える 1

5

date新しいデータ型 ( / datetime2)を明確にするだけです。

下位互換性のために、これは .NET の dateformat に依存していdatetimeます。

SQL Server 2012 の場合

SET DATEFORMAT DMY

SELECT CAST('2013-01-05' AS DATETIME),   /*May*/
       CAST('2013-01-05' AS DATETIME2),  /*Jan*/
       CAST('20130105' AS DATETIME),     /*Jan*/
       CAST('20130105' AS DATETIME2)     /*Jan*/

yyyymmddこれらのデータ型を扱う場合、明確な形式として使用できます。

日時データ型の究極のガイドを参照してください(これはunseparated、その記事では形式と呼ばれます)。

于 2013-10-24T12:00:38.470 に答える