我有类似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`
答案 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!!!