Извлечь строку между двумя символами в строке - PullRequest
0 голосов
/ 29 мая 2020

У меня есть набор строк со значениями даты и времени, и я хотел бы их извлечь. Я не уверен, возможно ли это даже с использованием T- SQL.

CREATE TABLE #Temp (
BLOB_NM VARCHAR(100)
);

INSERT INTO #Temp
SELECT 'products_country_20200528102030.txt'
UNION ALL
SELECT 'products_territory_20190528102030.txt'
UNION ALL
SELECT 'products_country_2020-05-20_20200528102030.txt'
;

Ожидаемые результаты:

20200528102030
20190528102030
20200528102030

Ответы [ 3 ]

1 голос
/ 29 мая 2020

Если вас интересует вспомогательная функция ... Я создал эту TVF, потому что у меня было многоуровневое извлечение частей строк (left, right, charindex, reverse, substing, et c)

Пример

Select * 
 From  #Temp A
 Cross Apply [dbo].[tvf-Str-Extract](Blob_NM,'_','.') B

Возвращает

BLOB_NM                                         RetSeq  RetVal
products_country_20200528102030.txt             1       20200528102030
products_territory_20190528102030.txt           1       20190528102030
products_country_2020-05-20_20200528102030.txt  1       20200528102030

Функция при заинтересованности

CREATE FUNCTION [dbo].[tvf-Str-Extract] (@String varchar(max),@Delim1 varchar(100),@Delim2 varchar(100))
Returns Table 
As
Return (  

    Select RetSeq = row_number() over (order by RetSeq)
          ,RetVal = left(RetVal,charindex(@Delim2,RetVal)-1)
    From  (
            Select RetSeq = row_number() over (order by 1/0)
                  ,RetVal = ltrim(rtrim(B.i.value('(./text())[1]', 'varchar(max)')))
            From  ( values (convert(xml,'<x>' + replace((Select replace(@String,@Delim1,'§§Split§§') as [*] For XML Path('')),'§§Split§§','</x><x>')+'</x>').query('.'))) as A(XMLData)
            Cross Apply XMLData.nodes('x') AS B(i)
          ) C1
    Where charindex(@Delim2,RetVal)>1

)
1 голос
/ 29 мая 2020

Для этого набора данных это должны делать строковые функции:

select blob_nm, substring(blob_nm, len(blob_nm) - 17, 14) res from #temp

Идея состоит в том, чтобы отсчитывать назад от конца строки и фиксировать 14 символов, предшествующих расширению (представленных последними 4 символов строки).

Демонстрация на DB Fiddle :

blob_nm                                        | res           
:--------------------------------------------- | :-------------
products_country_20200528102030.txt            | 20200528102030
products_territory_20190528102030.txt          | 20190528102030
products_country_2020-05-20_20200528102030.txt | 20200528102030
0 голосов
/ 29 мая 2020

я полагаю:

  • Расширение файлов не всегда составляет 3 символа длиной
  • Ваш формат даты / времени всегда состоит из 14 символов

Попробуйте это:

select 
CONVERT(DATETIME, STUFF(STUFF(STUFF(left(right(BLOB_NM, charindex('_', reverse(BLOB_NM) + '_') - 1), 14),13,0,':'),11,0,':'),9,0,' ')) as Result
from #Temp
...