如何用新数据更新SQL中的部分字符串

时间:2019-10-08 22:34:48

标签: sql tsql

我有类似Descr = ANY TEXT 31-Jan-2019 to 30-Jan-2020的字符串。是否可以用文本中的新日期替换这些日期?

新数据:

CycleBeginDate = '01/01/2020'
CycleEndDate = '12/31/2022'
Update Desc should be `ANY TEXT 01-Jan-2020 to 31-Dec-2022`

2 个答案:

答案 0 :(得分:0)

是的,如果您可以假设日期始终在“ desc”值的尽头(如您的示例中的内容)并且日期始终为零,则可能并且容易得多。是“ 2019年1月1日”,而不是“ 2019年1月1日)...”表示末尾的日期文本可以假定始终为26个字节;你可以的...

update t
     set desc = left( 'ANY TEXT 31-Jan-2019 to 30-Jan-2020', len( 'ANY TEXT 31-Jan-2019 to 30-Jan-2020' ) - 26 ) + @CycleBeginDate + ' to ' + @CycleEndDate
    from YourTable t

如果您要修改的日期范围可以采用不同的格式(并非总是要替换的26个字节的文本),或者可以在“ desc”值中位于不同的位置,则这显然会变得更加困难。

答案 1 :(得分:0)

这应该可以解决问题,并且为了好玩,我设置了它,以便无论日期在字符串中的位置如何都可以使用它。

DECLARE @string VARCHAR(1000) = 'Blah, blah... yadda, yadda... 31-Jan-2019 to 30-Jan-2020!!!'
--'Descr = ANY TEXT 31-Jan-2019 to 30-Jan-2020';

DECLARE @CycleBeginDate DATE = '01/01/2020';
DECLARE @CycleEndDate   DATE = '12/31/2022';

SELECT NewString = STUFF(STUFF(@string,pos.D1,11,f.D1),pos.D1+15,11,f.D2)
FROM   (VALUES('%[0-9][0-9]-[A-Z][a-z][a-z]-2[0-9][0-9][0-9]%',
        REPLACE(CONVERT(VARCHAR(11),@CycleBeginDate,106),' ','-'),
        REPLACE(CONVERT(VARCHAR(11),@CycleEndDate,106),' ','-'))) AS f(DPat,D1,D2)
CROSS APPLY (VALUES(PATINDEX(f.DPat,@string)))                    AS pos(D1);

返回:

NewString
------------------------------------------------------------
Blah, blah... yadda, yadda... 01-Jan-2020 to 31-Dec-2022!!!