У меня есть XML, который имеет несколько расписаний. Мне нужна помощь, чтобы показать с текущего дня (пример: понедельник, 14:00:03), сколько дней, часов или минут осталось до указанного c расписания [Sched 1 AT] или [Sched 2 AT] времени начала и дня [Sched 1 Weekdays] или [Sched 1 Weekdays] в отдельном столбце [TimeLeft]. У меня есть расписание:
- ежедневно
- раз в неделю в воскресенье или субботу
- раз в 2 недели в воскресенье или субботу
My XML и запрос:
create table MyTable (Roles XML)
insert into MyTable values
('<registered guid="{B40F5E54-21D0-4EDB-B636-B2F9EE30CCDE}">
<schedule tz="Local" start="2007-11-01 00:00:00">
<trigger type="MonthlyByWeek" exact="False" at="18:05:00" weeks="2" weekdays="6" description="Every 2nd Saturday" />
<trigger type="MonthlyByWeek" exact="False" at="00:05:00" weeks="2" weekdays="0" description="Every 2nd Sunday" />
<modifier type="Network" />
</schedule>
</registered>
<registered guid="{A4465325-926A-48FA-B11E-D6E486D76D93}">
<schedule tz="Local" start="2009-11-11 00:00:00">
<trigger type="Weekly" exact="True" at="00:05:00" frequency="1" weekdays="0" description="Weekly on Sunday" />
<trigger type="Weekly" exact="True" at="04:05:00" frequency="1" weekdays="0" description="Weekly on Sunday" />
<modifier type="Network" />
</schedule>
</registered>
<registered guid="{3DE26049-74E7-4FE3-9E47-CF022A6F7923}">
<schedule tz="Local" start="2011-11-11 00:00:00">
<trigger type="Weekly" exact="True" at="00:07:30" frequency="1" weekdays="1, 2, 3, 4, 5, 6" description="Daily" />
<modifier type="Network" />
</schedule>
</registered>')
SELECT T.Schedule.query('.') AS Schedule,
CASE
WHEN T.Schedule.value('(schedule/trigger/@type)[1]', 'nvarchar(100)') IS NULL
THEN 'None'
ELSE T.Schedule.value('(schedule/trigger/@type)[1]', 'nvarchar(100)')
END [Sched 1 When],
CASE
WHEN T.Schedule.value('(schedule/trigger/@at)[1]', 'nvarchar(100)') IS NULL
THEN 'None'
ELSE T.Schedule.value('(schedule/trigger/@at)[1]', 'nvarchar(100)')
END [Sched 1 AT],
-- Week Start Sunday
-- Sunday = 0
-- Monday = 1
-- Tuesday = 2
-- Wednesday = 3
-- Thursday = 4
-- Friday = 5
-- Saturday = 6
CASE
WHEN T.Schedule.value('(schedule/trigger/@frequency)[1]', 'nvarchar(100)') LIKE '%1%'
THEN 'Once'
WHEN T.Schedule.value('(schedule/trigger/@frequency)[1]', 'nvarchar(100)') IS NULL
THEN 'None'
ELSE 'Unknown'
END [Sched 1 Frequency],
CASE
WHEN T.Schedule.value('(schedule/trigger/@description)[1]', 'nvarchar(100)') IS NULL
THEN 'None'
ELSE T.Schedule.value('(schedule/trigger/@description)[1]', 'nvarchar(100)')
END [Sched 1 Description],
CASE
WHEN T.Schedule.value('(schedule/trigger/@weekdays)[1]', 'nvarchar(100)') = '1, 2, 3, 4, 5, 6'
THEN 'Mon, Tue, Wend, Thu, Fri, Sat'
WHEN T.Schedule.value('(schedule/trigger/@weekdays)[1]', 'nvarchar(100)') LIKE '%0%'
THEN 'Sun'
WHEN T.Schedule.value('(schedule/trigger/@weekdays)[1]', 'nvarchar(100)') LIKE '%6%'
THEN 'Sat'
ELSE 'Unknown'
END [Sched 1 Weekdays],
CASE
WHEN T.Schedule.value('(schedule/trigger/@type)[2]', 'nvarchar(100)') IS NULL
THEN 'None'
ELSE T.Schedule.value('(schedule/trigger/@type)[2]', 'nvarchar(100)')
END [Sched 2 When],
CASE
WHEN T.Schedule.value('(schedule/trigger/@at)[2]', 'nvarchar(100)') IS NULL
THEN 'None'
ELSE T.Schedule.value('(schedule/trigger/@at)[2]', 'nvarchar(100)')
END [Sched 2 AT],
CASE
WHEN T.Schedule.value('(schedule/trigger/@frequency)[2]', 'nvarchar(100)') LIKE '%1%'
THEN 'Once'
WHEN T.Schedule.value('(schedule/trigger/@frequency)[2]', 'nvarchar(100)') IS NULL
THEN 'None'
ELSE 'Unknown'
END [Sched 2 Frequency],
CASE
WHEN T.Schedule.value('(schedule/trigger/@description)[2]', 'nvarchar(100)') IS NULL
THEN 'None'
ELSE T.Schedule.value('(schedule/trigger/@description)[2]', 'nvarchar(100)')
END [Sched 2 Description],
CASE
WHEN T.Schedule.value('(schedule/trigger/@weekdays)[2]', 'nvarchar(100)') = '1, 2, 3, 4, 5, 6'
THEN 'Mon, Tue, Wend, Thu, Fri, Sat'
WHEN T.Schedule.value('(schedule/trigger/@weekdays)[2]', 'nvarchar(100)') LIKE '%0%'
THEN 'Sun'
WHEN T.Schedule.value('(schedule/trigger/@weekdays)[2]', 'nvarchar(100)') LIKE '%6%'
THEN 'Sat'
WHEN T.Schedule.value('(schedule/trigger/@weekdays)[2]', 'nvarchar(100)') IS NULL
THEN 'None'
ELSE 'Unknown'
END [Sched 2 Weekdays]
FROM
( SELECT CAST(Roles AS XML) as [State] from Mytable
) x
CROSS APPLY x.State.nodes('/registered') AS T(Schedule)