2017-06-30 6 views
1

多くのファイルをSQL Serverデータベースにロードしています。私はstring[DT_STR]として来る日付欄を持っている1つのフラットファイルを持っています。 データベースに「日付フィールド」が2つあります。 1つはvarchar、1つはdatetimeです。SSIS矛盾のあるm/dd/yyyyをyyyymmddに変換します。

datetimeカラムの変換は問題ありません。必要に応じてデータ変換/派生カラムを使用します。しかし、このvarcharのコラムが私に困っています。この列のデータベース値は、yyyymmdd形式である必要があります。ただし、この単一のファイルでは、日付の書式が変更されます。

ここでは通常SUBSTRING(...)という表現をしていますが、難しいのはこれらの日付の形式が変更されていることです。いくつかの値の例は、

08/16/2017 
8/16/2017 
08/6/2017 
08/06/2017 
10/6/2017 
10/06/2017 

である可能性があります。私はLEN([DATE]) == NUM_HERE ? do_THING : OTHER_CALCを試しましたが、10/6/2017の長さが8/06/2017と同じで、間違った結果が出るため、この方法は失敗しました。誰かがこれに対して良い回避策を持っていますか?

+1

にあなただけのキャストすることができるはずという変換aこれらの例は 'CAST('08/16/2017 'AS datetime)を使ってdatetimeに直接変換します。 – EMUEVIL

答えて

3

おそらく単純な日付に変換し、最終的な形式に変換します。 2012+の場合は、偽の日付をトラップするのにtry_convert()を使用してください。日時に

Declare @YourTable Table ([SomeCol] varchar(50)) 
Insert Into @YourTable Values 
('08/16/2017') 
,('8/16/2017') 
,('08/6/2017') 
,('08/06/2017') 
,('10/6/2017') 
,('10/06/2017') 

Select * 
    ,Formatted = convert(varchar(8),convert(Date,SomeCol),112) 
from @YourTable 

戻り

SomeCol  Formatted 
08/16/2017 20170816 
8/16/2017 20170816 
08/6/2017 20170806 
08/06/2017 20170806 
10/6/2017 20171006 
10/06/2017 20171006 
+0

ahhhh ..私はこのようには思っていませんでした!いい案。私はSSISの中でも外でもこれを実行できますか? – MattR

+0

@MattR Either/Or ...それが私だったら、SSISで派生列としてやっています。 –

+0

私はSSIS noobieです。これを表現にどのように変換すればよいですか?あなたが理解できる「宿題をやっている」気がしなければ... – MattR

2

Convert varchar型のデータとフォーマットされた文字列

SELECT CONVERT(varchar,(CONVERT(datetime, '8/6/2017')),112)