2016-09-14 9 views
1

私はここではむしろ奇妙な問題があります。私は変数を組み込むために自分で部分的に作成した日付文字列を持っています。問題は、別の言語設定を設定していることです。この場合、言語設定形式に合わせて文字列を変換する必要があります。私はこのコードを使用しています:日付形式の変換がSQL Serverの自己作成日付文字列に反映されない

cast(convert(varchar, cast(cast(getdate() as date) as varchar) + ' ' + RIGHT('0' + CAST(@HR as varchar), 2) + ':00:00.000', 120) as datetime) 

を私はエラーを取得する「datetimeデータ型にvarcharデータ型の変換は範囲外の値になった。」、あなたは間違って割り当てた場合、正常ですキャストする前の日付形式。

私が個人的に作成した日付文字列を変換しようとすると、設定したフォーマットコードに関係なくフォーマットが変更されないという問題があります。数字をハードコードしても変更されません。私の変数:00::2016年9月14日02で

convert(varchar, cast(cast(getdate() as date) as varchar) + ' 0' + CAST(2 as varchar) + ':00:00.000', 101) 

結果00.000

例えば、2016年9月14日で

convert(varchar, dateadd(Hour, 2, getdate()), 101) as datetime 

結果。

私は別の言語設定をしていますが、SQLサーバーは標準形式の日付形式を常に認識しているとは限りませんか?

私はこの問題を克服するためにアドバイスをしてください。

ありがとうございます!

PS:ブルガリア語を設定する前に、変換されたdatetime列を変数に挿入することで問題を解決することができました。私はまだ問題の原因を知ることに非常に興味があります。

+0

'DBCC USEROPTIONS'を使用すると、データベースが使用している日付形式を確認できます。以前に設定されていなかった場合は、言語を変更すると変更されます。しかし、 'SET DATEFORMAT DMY'のようにdateformatを設定すると、言語を変更するとdateformatは同じままになります。詳細については、以下を参照してください。https://msdn.microsoft.com/de-de/library/ms189491.aspx – Nebi

+0

ありがとうございます。これは私の目標(私はそれをすでに解決した)を実現するのに役立ちますが、それでも私の質問に答えることはできません。 – GeorgiG

+0

あなたはそうです、これはあなたの質問に対する答えではありませんでした。しかし、多分私の答えは少し質問に役立つです。 'CONVERT'の内部のデータ型のためです。 – Nebi

答えて

1

私は質問のためにsoutionを持っているかもしれません:変換時にSQL-SERVERでフォーマットが異なって扱われるのはなぜですか?

CONVERT(data_type(length),expression,style) 

STYLE値は日付/時刻のために適用されます。 これは、出力が異なるデータ型のためです。あなたが結果を得る

SELECT convert(varchar, dateadd(Hour, 2, getdate()), 101) as datetime 

: 次の例を参照してくださいここで

09/14/2016 

あなたはvarchardatetimeデータ型を変換していると101STYLE - 値はCONVERTに適用され、出力はに変換され、そのフォーマット。

例2は同じであるが、最も内側の部分は、それを変換する前にvarcharにキャストされています

SELECT convert(varchar, CAST(dateadd(Hour, 2, getdate()) AS varchar), 101) as datetime 

あなたが得る結果は次のとおりです。だから、

Sep 14 2016 4:09PM 

我々は変換しようとしているので、 varcharvarcharSTYLEの値は変換に適用されません。

最初のクエリは、その後、他の切り抜い扱われている理由もある。ここでは

SELECT convert(varchar, cast(cast(getdate() as date) as varchar) + ' 0' + CAST(2 as varchar) + ':00:00.000', 101) 

あなたは、変換する前に(varchar型として日付としてキャスト(GETDATE()))varcharキャストにキャスト。したがって、STYLE値は、データ型の日付/時刻からではないため適用されません。

私はそれを少しはっきりさせることを望みます。これが助けられたら教えてください。

+0

ありがとう! – GeorgiG

1

変換を使用してdatetimeをフォーマットすると、スタイルナンバーを渡すことができます。
Looky hereまたはhereです。

以下のクエリは、カスタム作成された日付時刻を126(ISO8601)形式に変換します。

declare @d int = 2; 

SELECT 
CONVERT(varchar, 
     CONVERT(datetime, 
       CONCAT(FORMAT(GETDATE(),'yyyy-MM-dd'),' ',@d,':0') 
       ) 
     ,126) AS MyDateStamp1, 
CONVERT(varchar, 
     CONVERT(datetime, 
       CONVERT(varchar,GETDATE(),102)+' '+convert(varchar,@d)+':0' 
       ) 
     ,126) AS MyDateStamp2; 

FORMAT & CONCAT関数は、SQL Server 2012の以降で使用することができます。
しかし、以前のバージョンをお持ちの場合は、代わりにCONVERTを使用してください。

+0

私は既にクエリーに書式スタイル番号を持っています。それは(少なくとも正確には)適用されません、それは私の質問の全体のポイントです。とにかく、あなたはFORMAT機能について私に思い出させるのに非常に役に立ちました。 – GeorgiG

+1

問題は、varcharをvarchar形式に変換しようとしたことです。 'select convert(varchar、 '2001-01-01 01:01:00'、101)'はエラーを発生させませんが、無意味です。答えでは、varcharはdatetimeに変換され、datetimeは特定の形式のvarcharに変換されます。 – LukStorms

0

追加ヒント:

あなたは上記のCONVERTソリューションを使用している場合は、


"(varchar型、CAST varchar型AS(DATEADD(時間、2、GETDATE()))、101)に変換" をすることを注意してください
では、varcharにデータ型を設定する必要があります。

私はちょうど

"(日付、ML.StartDate、101)に変換する" とスタイル101はYYYY/MM/DDで、出力はYYYY-MM-DDだったので、私は知っていた

コードに出くわしました何かが間違っていました。コードを

に変更すると、Convert(varchar、ML.StartDate、101)

結果セットに適切な日付スタイルが表示されました。

関連する問題