2017-10-26 1 views
0

私は2つのdatetime値をvarcharsとして挿入しています。関連する列のデータ型は両方ともDATETIMEです(列名とは異なり、PERFORMANCEDATEDATETIMEで、PERFORMANCETIMEです)。テストデータはツールを使用して生成されるため、何千行もあるので変更することはできません。varcharからdatetimeへの変換に失敗しました。 2つの類似した構造の日付ですが、1つだけが渡されます

SET DATEFORMAT ymd 
GO 

INSERT INTO CONCERT (PERFORMANCEDATE, TOWNNAME, PERFORMANCETIME, LOCATION, TITLE) 
VALUES ('1993-5-2 13:26:22', 'X', '1604-9-13 12:0:48', 'X', 'X') 

INSERT INTO CONCERT (PERFORMANCEDATE, TOWNNAME, PERFORMANCETIME, LOCATION, TITLE) 
VALUES ('1102-11-26 9:4:56', 'X', '1534-2-10 11:34:36', 'X', 'X') 

最初の挿入が正常に動作するが、第2のインサートは

日時データ型にvarcharデータ型の変換は、範囲外の値をもたらし、このエラーをスロー。

なぜ2番目のエラーは失敗しますか?実際、最初のもの以外のすべての挿入物は失敗します。

+1

私は最初のものも同様に失敗しません驚いています。 SQL Serverの日時は、1753年1月1日から9999年12月31日の範囲です。https://docs.microsoft.com/en-us/sql/t-sql/data-types/datetime-transact-sql – hatchet

+0

開始日年が実際に問題になるかもしれない、私はそれを調べます。 – Skere

+0

別の問題はあなたの時間のフォーマットになります:分だけ1桁。 – Nikolaus

答えて

1

SQL Server datetimeの最小日付は1753年1月1日です。挿入する列をdatetime2に変更することができます。これは、日付が '0001-01-01 、

時間を使って、日付 ​​『9999-12-31

https://docs.microsoft.com/en-us/sql/t-sql/data-types/datetime2-transact-sql

'は最大で』また日時を基準に、Microsoftはも、あなたはDATETIME2使用すべきであることを示唆していることに注意してください新しい作業のdatetime2およびdatetimeoffsetデータ型。これらの型はSQL標準に準拠しています。彼らはより移植性があります。 time、datetime2およびdatetimeoffsetは、より多くの秒精度を提供します。 datetimeoffsetは、グローバルにデプロイされたアプリケーションのタイムゾーンのサポートを提供します。

https://docs.microsoft.com/en-us/sql/t-sql/data-types/datetime-transact-sql

関連する問題