2016-06-28 5 views
1

コメントと日付が同じセルに含まれるセルをExcelシートに月単位で受け取ります。スプレッドシートをSQLテーブルにインポートし、最後の8-10文字(日付)を抽出し、NVARCHARからDATE形式に変換する必要があります。最後の空白の前の文字を削除し、NVARCHARのDATEに結果を変換します

例:これにアクティブ/いいえ住所2016年4月11日
2016年4月11日

私は最大の課題
このことから、月と日付を表す数字は固定長ではなく、1文字または2文字のいずれかになります。単一文字の日数または月数には、先行ゼロはありません。

私はCHARINDEX、RIGHT()、LEFT()、REPLACE、SUBSTRINGのすべての組み合わせを試しましたが、私は何の成功もなしに考えることができませんでした。

これを参考にしていただければ幸いです。

+0

非常に申し訳ありませんが、これも含めませんでした。日付の前のテキストも長さが変わります。 「Active/No Address」プレフィックスも同様に変更されます。 –

+0

** _最後の解決策:_ ** REPLACE(DATE、RIGHT(ColumnName、CHARINDEX( ''、REVERSE(ColumnName)、0))、110)、 ' - '、 '/')ASエイリアス –

答えて

1

私が行う方法は、文字列を反転させ、最初のスペースを見つけて、そのテキストのチャンクをフォーマットすることです。このコードは、単一の値の月と日の複数のケースで機能し、日付の前のテキストの長さの影響を受けません。

Declare @1 VARCHAR(50) = 'Active/No Address 4/11/2016' 
Declare @2 VARCHAR(50) = 'Active/No Address 9/3/2016' 
Declare @3 VARCHAR(50) = 'Active/No Address 12/31/2016' 

SELECT 


REPLACE(CONVERT(DATE, RIGHT(@1,CHARINDEX(' ',REVERSE(@1),0)), 110), '-','/') 
, REPLACE(CONVERT(DATE, RIGHT(@2,CHARINDEX(' ',REVERSE(@2),0)), 110), '-','/') 
, REPLACE(CONVERT(DATE, RIGHT(@3,CHARINDEX(' ',REVERSE(@3),0)), 110), '-','/') 
+0

110はmmです-dd-yyyy ... 101(mm/dd/yyyy)を意味しましたか? –

+0

私のコードを実行すると、それをdatetimeに変換するとyyyy-mm-dd – dfundako

+0

と表示されます。最後の表示はUIまでです。元々の質問はそれを日時計にすることだけだったので、あなたの元のバージョンは「正しい」と思っていました。あなたの画面に表示されていたものとは何の関係もありませんでした。(クライアントのUIです) –

0

このようにします。

declare @text nvarchar(max) = 'Active/No Address 4/11/2016'; 
declare @index int = charindex(' ', reverse(@text)) - 2; 
declare @foo nvarchar(max) = substring(@text, len(@text) - @index, @index + 1); 
select convert(datetime, @foo, 101)