2017-11-15 8 views
0

SourceIDという名前のテーブルが1つあります。すべてのレコードにはたくさんの '|'最後のパイプの後の日付は、4つの異なる形式で表示されます。この日付を1つの形式で更新しようとしています。データは次のようになります。文字を検索し、日付形式を更新するために部分文字列を使用する方法?

SourceID 
ARS|1C47|13.2|2017-09-29 
mm|M8|160|030|ZX7|Sep 29 2017 12:00AM 
TMP_Schedule | Int | MG100 | 20370429 
TS|01|0|USD|I|S|ZDER|10/31/2017 

Iは、DD/MM/YYYYのようなソースIDと一つの標準化さ日付形式からのすべてのデータと同じテーブルに、別のフィールド(SourceID_Revised)を更新するコードを思い付くことを試みました。私はいくつかの異なるアイデアを試してみましたが、これは思いついたことですが、もちろんそれはうまくいきません。

UPDATE TBL_HIST 
SET  SourceID_Revised = SourceID 
WHERE  (SELECT CONVERT(VARCHAR(8), SUBSTRING([SourceID],select dbo.LastIndexOf('|', [SourceID]),99)) AS [DD/MM/YYYY] 
FROM [dbo].[TBL_HIST] 

これを使用して最後のパイプを検索します。私は、SQL Server上で2008

UPDATEよ

FUNCTION [dbo].[LastIndexOf] (@stringToFind varchar(max), @stringToSearch varchar(max)) 
RETURNS INT 
AS 
BEGIN 
    RETURN (LEN(@stringToSearch) - CHARINDEX(@stringToFind,REVERSE(@stringToSearch))) + 1 
END 

ジョン、私はこの仕事ができると思います!それは約5秒間実行され、次に外に出る。私はこのメッセージを受け取ります。

メッセージレベル241、状態1、行1 文字列から日付および/または時刻を変換するときに変換に失敗しました。

私は、そのフィールドの一部のレコードに日付のようなものが全くないために推測しています。だからこのようなことがある:

40285 
3467868 

私はエラーが発生していると思います。どうすればそれらをスキップすることができますか、またはOn Error Resume Nextのようなものをやりますか?

私が気づいたもう1つのことは、数百のレコードがこのフォーマットを持つことです。これらについては

101.002.112020-06-30 
102.0012.102019-09-30 
125.02.022022-06-30 

、私は、最後のドットを見つける右へに移動し、

MM/DD/YYYY: 
06/30/2020 
09/30/2019 
06/30/2022 

ませDD/MM/YYを取得したいです!

答えて

2

あなたが2012+ではありませんので、あなたは(try_convertを使用することはできません)

付属のサンプルでは、​​次の作品が、私は、変換エラーの懸念(すなわち偽の日付)

注意を持っていますParse UDFを使用できない場合、またはParse UDFを使用できない場合は、以下をインラインに変換することができます。

Declare @YourTable Table ([SourceID] varchar(50)) 
Insert Into @YourTable Values 
('RS|1C47|13.2|2017-09-29'), 
('mm|M8|160|030|ZX7|Sep 29 2017 12:00AM'), 
('TMP_Schedule | Int | MG100 | 20370429'), 
('TS|01|0|USD|I|S|ZDER|10/31/2017') 

Update @YourTable Set SourceID=Replace(SourceID,RetVal,AsDate) 
    From @YourTable A 
    Cross Apply (
       Select Top 1 *,AsDate = convert(varchar(10),convert(Date,RetVal),101) 
       From [dbo].[tvf-Str-Parse]([SourceID],'|') 
       Order By RetSeq Desc 
       ) B 

Select * From @YourTable 

戻り値を更新表

SourceID 
RS|1C47|13.2|09/29/2017 
mm|M8|160|030|ZX7|09/29/2017 
TMP_Schedule | Int | MG100 | 04/29/2037 
TS|01|0|USD|I|S|ZDER|10/31/2017 

UDFもし興味が

CREATE FUNCTION [dbo].[tvf-Str-Parse] (@String varchar(max),@Delimiter varchar(10)) 
Returns Table 
As 
Return ( 
    Select RetSeq = Row_Number() over (Order By (Select null)) 
      ,RetVal = LTrim(RTrim(B.i.value('(./text())[1]', 'varchar(max)'))) 
    From (Select x = Cast('<x>' + replace((Select replace(@String,@Delimiter,'§§Split§§') as [*] For XML Path('')),'§§Split§§','</x><x>')+'</x>' as xml).query('.')) as A 
    Cross Apply x.nodes('x') AS B(i) 
); 
--Thanks Shnugo for making this XML safe 
--Select * from [dbo].[tvf-Str-Parse]('Dog,Cat,House,Car',',') 
--Select * from [dbo].[tvf-Str-Parse]('John Cappelletti was here',' ') 
--Select * from [dbo].[tvf-Str-Parse]('this,is,<test>,for,< & >',',') 
関連する問題