2012-05-30 10 views
6

SQL Server 2008 R2 Expressの特定のインスタンスでロケールに問題が発生しています。ロケールによる文字列のdatetimeへの変換エラー

私は英国にいると、次は失敗します。

SELECT CAST('2012-12-31' AS DATETIME) 

エラーメッセージ:

datetimeデータ型にvarcharデータ型の変換は、アウトオブになりました範囲値。

Windowsサーバーのロケールは英国英語です。ログインロケールは英国英語です。照合が '問題の場合'はLatin1_General_CI_ASです。

データベース 'language'は英語(米国)ですが、これは別のサーバー上の別のインスタンスと同じであり、上記のSQLは失敗しません。

どのような考えですか?あなたが明示的にこのケースでは、あなたの変換に日付フォーマットを定義する必要があり

答えて

8

データベース接続を行うユーザー(SQLユーザー)は、言語を英語に設定します。

これは、これは問題があるかどうかを確認するために、クエリに

一つの方法を発行する接続のSQLユーザーに固有の設定がある... Management Studioでこれを実行し、クエリを発行するSQLユーザーとしてログイン

SET LANGUAGE English 
SELECT CAST('2012-12-31' AS DATETIME) 

これが動作する場合、SQLユーザのデフォルト言語は、YYYYMMDDを使用し、常に、日付リテラルのYYYY-MM-DDを使用しないでください

+1

解決策は、すべてのユーザーを同じ言語にすることに同意しません。言語が他の目的に使用されているため、意図的に設定されているとしたらどうでしょうか?新しいユーザーが作成されるたびにコードを修正するまでコードが失敗することがあるため、各ユーザーの修正は面倒です。コードを修正すると、問題が修正されます。 –

+0

これはすべてのユーザーに適用されるわけではありません。これはSQLログインアカウント – jglouie

+0

用です。新しいSQLログインアカウントを追加し、その言語がBritishに設定されているときに、コードが何をやり直すのか推測してください。 –

2

は120です:

SELECT CONVERT(DATETIME,'2012-12-31',120) 

あなたはより多くの日付書式を表示するには、このページを見てとることができます。 についてはhttp://msdn.microsoft.com/en-us/library/ms187928.aspx

+0

問題がこれでは、ライブの正確なレプリカであると考えられますシステム。ライブセットアップは実際に動作し、一見同じ設定を使用しています。私はキャストすることができることを知っているが、ミラーリングされたシステムを変更することはできない。 – Dillorscroft

6

適切に設定。これは、ロケールに関係なく、DATEFORMATの設定、言語設定、地域設定などの、失敗することはありません。おそらく

SELECT CAST('20121231' AS DATETIME); 

やりがいのある読み取り:http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/16/bad-habits-to-kick-mishandling-date-range-queries.aspx

+0

あなたのユーザーが日付をYYYYDDMMとして保存するとどうなりますか? SQLは決して分かりません。そして、あなたは、トラックロードのエラーを正確に特定するのが非常に難しくなります。 lamak氏のように、日付形式で変換する方がはるかに安全です。 –

+2

@Thierryユーザーが「20121208」を明白な標準として渡し、12月8日ではなく8月12日を意味する場合、間違った日付が格納されます。それらが '' 20121612 ''に合格すると、エラーを受け取ります。それはあなたのユーザーが '' 2012-12-08 ''をLamakのメソッドに渡したときとまったく同じものです。違いは、YYYYMMDDは常にSQL Serverによってそのように解釈されますが、YYYY-MM-DDは時々間違った方法で解釈されることです。 –

+0

私は情報をありがとう、参照してください。地域の設定はYYYYDDMMです。なぜなら私たちはクライアントにそれを強制するのですが、デフォルトではDDMMYYYYというローカル設定になっていて、しばしば日付に関する混乱につながります。 –

関連する問題