2016-11-11 6 views
1

テーブルのSTRING列には、「mm-dd-yyyy」と「yyyy-mm-dd」の両方の日付形式があります。データを選択している間、私はDATE形式にキャストしようとしていますが、変換エラーが発生しています。 SQLは2つの異なるフォーマットを同時に変換することができないからです。これをどのようにして実現すれば、両方のフォーマットをDATEに変換することができますか?SQL Serverで異なる日付形式を単一の形式に変換する

+2

床を連続的にモップするのではなく、漏れを修正できませんか?私。カラムのデータ型を 'date'に変更し、必要に応じてこのデータを挿入しているアプリケーションを最初に修正します。 –

+0

私はできることを望む。しかし、文字列のデータは "ABCD - 01-01-2016"形式であり、このデータは残念ながら私の範囲にはないアプリケーションから来ています。だから、私はそれのサブ文字列を行うと、同じからdatepartを取得し、それをDateに変換します。 – Coder157

答えて

3

とにかくこれらを文字列として格納するのではなく、dateデータ型を使用する必要があります。

でも、それに変換するコードはまだ必要です。

あなたは私が正しいだ場合は、一度にuは同じ時間@二つの異なる形式にDATEをキャストすることはできません110および120

WITH T(Col) As 
(
SELECT '04-01-2010' UNION ALL 
SELECT '2010-04-01' 
) 
SELECT Col, 
     CONVERT(date, Col, 
     CASE WHEN COL LIKE '[0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9]' then 110 
      WHEN COL LIKE '[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]' then 120 
     END 
     ) 
FROM T 
0

間でスタイルを切り替えることがCASE表現を使用することができます。しかし、あなたの質問に探して、私はあなたの列のすべての明確な日付形式を分析し、下に書かれたクエリを記述しようとするあなたをお勧めします:

DECLARE @DATECol TABLE (DATEVAL varchar(20)) 
INSERT @DATECol VALUES ('2016-07-01'),('01/07/2016'),('01JULY2016'),('19/07/16'),('28-08-2008') 

select 
    CASE 
     WHEN ISNUMERIC(left(DATEVAL,4)) = 1 then CAST(DATEVAL as DATE) 
     WHEN LEN(DATEVAL) = 10 then CONVERT(DATE, DATEVAL, 103) 
     WHEN LEN(DATEVAL) = 8 then CONVERT(DATE, DATEVAL, 3) 
     WHEN CHARINDEX('/',DATEVAL) = 0 and ISNUMERIC(DATEVAL) = 0 then CONVERT(DATE, DATEVAL, 106) 
    END AS [Date] FROM @DATECol 

は異なるDATEの出力形式については、以下http://www.w3schools.com/sql/func_convert.asp

希望これをリンクを参照してください。助けて!

関連する問題