これは、オペレーティングシステムの地域設定、現在のユーザーの言語、日付形式の設定など、さまざまな要因によって異なります。デフォルトでは、WindowsはUS English
を使用します 、およびユーザーの設定はUS English
およびMDY
。
しかし、これがどのように変化するかを示すいくつかの例があります。
ユーザーはBRITISH言語設定を使用しています:
-- works:
SET LANGUAGE BRITISH;
SELECT CONVERT(DATETIME, '30-04-2012 19:01:45');
-- fails:
SELECT CONVERT(DATETIME, '04/13/2012');
GO
(エラー)
ユーザーはFrançaisを使用しています:
-- works:
SET LANGUAGE FRENCH;
SELECT CONVERT(DATETIME, '30-04-2012 19:01:45');
-- fails:
SELECT CONVERT(DATETIME, '04/13/2012');
GO
(エラー)
ユーザーは再びFrançaisを使用しています:
SET LANGUAGE FRENCH;
-- fails (proving that, contrary to popular belief, YYYY-MM-DD is not always safe):
SELECT CONVERT(DATETIME, '2012-04-30');
GO
(エラー)
ユーザーはMDYの代わりにDMYを使用しています:
SET LANGUAGE ENGLISH;
SET DATEFORMAT DMY;
-- works:
SELECT CONVERT(DATETIME, '30-04-2012 19:01:45');
-- fails:
SELECT CONVERT(DATETIME, '04-30-2012');
GO
(エラー)
常に最善の策は、ISO標準、非地域、安全、明確な日付形式を使用することです。私が通常お勧めする2つは次のとおりです。
YYYYMMDD - for date only.
YYYY-MM-DDTHH:MM:SS[.mmm] - for date + time, and yes that T is important.
これらのどれも失敗しません:
SET DATEFORMAT MDY;
SET LANGUAGE ENGLISH;
SELECT CONVERT(DATETIME, '20120430');
SELECT CONVERT(DATETIME, '2012-04-30T19:01:45');
SET LANGUAGE FRENCH;
SELECT CONVERT(DATETIME, '20120430');
SELECT CONVERT(DATETIME, '2012-04-30T19:01:45');
SET LANGUAGE BRITISH;
SELECT CONVERT(DATETIME, '20120430');
SELECT CONVERT(DATETIME, '2012-04-30T19:01:45');
SET DATEFORMAT DMY;
SELECT CONVERT(DATETIME, '20120430');
SELECT CONVERT(DATETIME, '2012-04-30T19:01:45');
したがって、ユーザーがフリーテキストの日付形式を入力できるようにする(または信頼性の低い形式を自分で使用する)のではなく、入力文字列を制御して、これらの安全な形式の1つに準拠していることを確認することを強くお勧めします。そうすれば、ユーザーがどのような設定を持っているか、または基礎となる地域の設定が何であるかは関係ありません。日付は常に意図された日付として解釈されます。現在、ユーザーがフォームのテキストフィールドに日付を入力できるようにしている場合は、それを停止し、カレンダーコントロールまたは少なくとも選択リストを実装して、SQLServerに返される文字列形式を最終的に制御できるようにします。
背景については、TiborKarasziの