我有一张表,名为“日期”。
我有一个名为 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 ('<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 |
+----+-------------------------------------------------------------------------+