提取并处理可变长度字符串中不同数量的定界符之间的子字符串

问题描述 投票:0回答:1

我有一张表,名为“日期”。

我有一个名为 SENTDATE 的列,其中每个字段都有不同数量的日期,每个日期用分号 (;) 分隔。日期目前的格式为 YYYYMMDD 例如:

20240529;20240626;20240626;20240626;20240626;20240626
20240530;20240620
20240605
20240523;20240523

我正在尝试将每个日期转换为 DD/MM/YYYY 格式,并用分号分隔它们,这样它们看起来像这样:

29/05/2024;26/06/2024;26/06/2024;26/06/2024;26/06/2024
30/05/2024;20/06/2024

不幸的是,我使用的是 SQL Server 2005,因此为了更改格式,我需要使用

SUBSTRING
,然后组合日期的不同部分,并散布正斜杠:

SUBSTRING(SENTDATE, 1, 4) + '/' + SUBSTRING(SENTDATE, 5, 2) + '/' + SUBSTRING(SENTDATE, 7, 2)

但这不是问题。

您知道如何处理分号之间的每个日期吗?我假设这将是字符串的某种分割然后重新组合?

我实际上还没有在这里尝试过任何东西。我可以使用

PARSENAME
但我不知道如何使用不同数量的分隔符来做到这一点。

谢谢你。

sql sql-server split sql-server-2005
1个回答
0
投票

您确实应该更改表的架构以符合基本的数据库规范化规则。但是,如果您必须处理这个糟糕的模式,您可以执行以下操作:

样本数据与查询

DECLARE @t TABLE (Id INT , SENTDATE VARCHAR(1000))

INSERT INTO @t (Id , SENTDATE)
VALUES 
 ( 1 , '20240529;20240626;20240626;20240626;20240626;20240626')
,( 2 , '20240530;20240620')
,( 3 , '20240605')
,( 4 , '20240523;20240523');


WITH CTE AS 
(
     SELECT A.Id  
         , CONVERT(VARCHAR(10) , CAST(Split.a.value('.', 'VARCHAR(100)') AS DATE) , 103) AS SENTDATE  
     FROM  
     (
         SELECT Id,  
             CAST ('<M>' + REPLACE(SENTDATE, ';', '</M><M>') + '</M>' AS XML) AS Data  
         FROM  @t
     ) AS A CROSS APPLY Data.nodes ('/M') AS Split(a)
 )
SELECT  ID
       ,STUFF((SELECT '; ' + CAST(SENTDATE AS VARCHAR(10)) [text()]
         FROM CTE 
         WHERE ID = t.ID
         FOR XML PATH(''), TYPE)
        .value('.','NVARCHAR(MAX)'),1,2,' ') List_Output
FROM CTE t
GROUP BY ID

输出

+----+-------------------------------------------------------------------------+
| ID |                               List_Output                               |
+----+-------------------------------------------------------------------------+
|  1 |  29/05/2024; 26/06/2024; 26/06/2024; 26/06/2024; 26/06/2024; 26/06/2024 |
|  2 |  30/05/2024; 20/06/2024                                                 |
|  3 |  05/06/2024                                                             |
|  4 |  23/05/2024; 23/05/2024                                                 |
+----+-------------------------------------------------------------------------+
© www.soinside.com 2019 - 2024. All rights reserved.