我有一个表
dates
,其中有一列 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
但我不知道如何使用不同数量的分隔符来做到这一点。
谢谢你。
您确实应该更改表的架构以符合基本的数据库规范化规则。但是,如果您必须处理这个糟糕的模式,您可以执行以下操作:
样本数据与查询
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 ('<Row>' + REPLACE(SENTDATE, ';', '</Row><Row>') + '</Row>' AS XML) AS Data
FROM @t
) AS A CROSS APPLY Data.nodes ('/Row') 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 |
+----+-------------------------------------------------------------------------+
注意 我非常确定 SQL Server 2005 中引入了
FOR XML PATH
、CROSS APPLY
和 CTE
等概念,因此此解决方案应该适合您。