我有一个表格,其中包含某些列值中的字符串,告诉我是否应该删除该行....但是这个字符串需要一些解析才能理解是否要删除。
字符串是什么:它告诉我会议的再次发生,例如每天从21日开始10次会议。
我的表格是一个名为recurrence
的列:
Recurrence
-------------------------------
daily;1;21/03/2015;times;10
daily;1;01/02/2016;times;8
monthly;1;01/01/2016;times;2
weekly;1;21/01/2016;times;4
怎么做:如果会议结束,则删除该行。
字符串格式如下
<frequency tag>;<frequency number>;<start date>;times;<no of times>
例如
daily;1;21/03/2016;times;10
每天从21月3日开始,持续10次
如果字符串表明所有会议都在过去,有人知道如何计算吗?我想要一个select语句,它告诉我重复值是否过去 - true或false
答案 0 :(得分:2)
我添加了一个字符串('weekly;1;21/05/2016;times;4')
,绝对不能删除它以显示一些输出。首先尝试将临时表“@ table1”中的所有数据添加到表中,然后检查是否所有数据都被删除了。
DECLARE @table1 TABLE (
Recurrence nvarchar(max)
)
DECLARE @xml xml
INSERT INTO @table1 VALUES
('daily;1;21/03/2016;times;10'),
('daily;1;21/03/2015;times;10'),
('daily;1;01/02/2016;times;8'),
('monthly;1;01/01/2016;times;2'),
('weekly;1;21/01/2016;times;4'),
('weekly;1;21/05/2016;times;4')
SELECT @xml= (
SELECT CAST('<s><r>' + REPLACE(Recurrence,';','</r><r>') + '</r><r>'+ Recurrence+'</r></s>' as xml)
FROM @table1
FOR XML PATH ('')
)
;WITH cte as (
SELECT t.v.value('r[1]','nvarchar(10)') as how,
t.v.value('r[2]','nvarchar(10)') as every,
CONVERT(date,t.v.value('r[3]','nvarchar(10)'),103) as since,
t.v.value('r[4]','nvarchar(10)') as what,
t.v.value('r[5]','int') as howmany,
t.v.value('r[6]','nvarchar(max)') as Recurrence
FROM @xml.nodes('/s') as t(v)
)
DELETE t
FROM @table1 t
LEFT JOIN cte c ON c.Recurrence=t.Recurrence
WHERE
CASE WHEN how = 'daily' THEN DATEADD(day,howmany,since)
WHEN how = 'weekly' THEN DATEADD(week,howmany,since)
WHEN how = 'monthly' THEN DATEADD(month,howmany,since)
ELSE NULL END < GETDATE()
SELECT * FROM @table1
输出:
Recurrence
-----------------------------
weekly;1;21/05/2016;times;4
(1 row(s) affected)