2013-07-09 22 views
5

最近、データベースを別のサーバーに移行しました。このため、日付書式の照会が何とか変更されたと思います。 文字列のSQL Server日付書式

は、以前我々が使用する必要があり、今しかし、次の..

SELECT * FROM table WHERE date > 'YYYY-MM-DD' 

を使用することができます。..

SELECT * FROM table WHERE date > 'YYYY-DD-MM' 

誰かが私が前のバージョンに戻って取得するように変更するために必要なものを教えてもらえます?

+0

答えがありますhttp://stackoverflow.com/questions/17491459/how-can-i- get-sql-server-to-use-user-locale-for-a-query-for-a-query –

答えて

2

言語/文化の問題だ -

クエリ:現在の設定を読む

SET DATEFORMAT ymd 

を:

DBCC USEROPTIONS 

出力:あなたは正しいです

Set Option     Value 
-------------------------- ----------------- 
... 
language     us_english 
dateformat     ymd 
... 
+0

どのように現在の日付形式が読み込まれますか? – lisburnite

+2

'DBCC USEROPTIONS' – Devart

+0

を試してみてください。現在dmyに設定されています。確かに、 'DD-MM-YYYY'を使用してクエリする必要があります。 – lisburnite

0

それはこの1つの試してみてください

Set Language 'us_english' 
+0

現在の言語は何ですか? – lisburnite

+0

この状況で@lisburniteも 'DBCC USEROPTIONS'を使用しようとしました – Devart

+2

select @@ language – Serge

2

は、日付形式はサーバー間で異なっています。

日付リテラルを'YYYY-MM-DD'と指定すると、現在の日付形式にかかわらず、多くの人がそれを解釈するという罠に陥ります。これは間違っています。 SQL Serverでは、文字列の先頭に4桁の数字が表示され、年を表すことが正しく推定されます。ただし、現在の日付形式を使用して、月と日のどちらのラウンドにあるかを判断します。たとえば、英国の場合、'DD-MM-YYYY'のような日付リテラルを解釈するのにDMYの日付書式が必要ですが、'YYYY-MM-DD'のような日付リテラルを解釈する日付形式がMDYであるため、これは厄介な状況に陥ります。

あなたは、いくつかのオプションがあります:

  • SET DATEFORMAT YMDを、ユーザーが日付を他の方法を入力することはできません。
  • ODBCの日付リテラル構文{d'YYYY-MM-DD'}を使用します。これは現在の日付形式に関係なく正しく解析されます。 CONVERT(DATE, 'YYYY-MM-DD', 120)も同じ効果があります。
  • クエリからすべてのリテラル値を削除し、代わりにパラメータを使用します。これははるかに良い選択肢であり、強くお勧めします。
+0

ありがとうございます。それは最初に解析された年に関しては意味があり、その後は月と日付の順番が続きます。 – lisburnite

+0

ISOの日付形式 –

2

文字列に異なる形式を使用している場合、この動作を回避できます。

常にiso形式が2つあります.SQL Serverは、サーバーの日付形式設定に関係なく、常に同じ方法で解析します。

これらは:

1)短縮形:YYYYMMDD。例 '20120301' - 2012年3月1日

2)ロングフォーム:YYYY-MM-DDTHH:MM:SS.msms '例 '2012-03-01T12:13:00.000Z' - 2012年3月1日13時12時(PM)

長い形式では、ミリ秒はオプションです。これは完全に許容されるISO datetime '2012- 03-01T12:13:00Z '

最後のZはタイムゾーン情報です。 SQL Serverではこれを実際には必要としません。 (他の製品があるけれども、もう少し厳しい)

例えば、これを試してください:あなたは常には、2つのISO規格のいずれかを使用してみてください日付を入力するテキストを使用

DECLARE @foo DATETIME 

SET DATEFORMAT DMY 

-- this will be the 3rd of january in DMY 
SET @foo = '2012-03-01' 
SELECT 'DMY: Not ISO', @foo 

SET @foo = '20120301' 
SELECT 'DMY: ISO', @foo 

SET DATEFORMAT MDY 

-- this will be the 1st of March in MDY 
SET @foo = '2012-03-01' 
SELECT 'MDY: not ISO', @foo 

SET @foo = '20120301' 
SELECT 'MDY: ISO', @foo 

。それは物事をより決定論的にするだけです。

ショート形式(SQL Serverなど) http://msdn.microsoft.com/en-US/library/ms187085(v=sql.90).aspx

ISO 8601形式(SQL Serverなど) http://msdn.microsoft.com/en-us/library/ms190977(v=sql.90).aspx

+0

+1を使用してください。 – Devart

関連する問題