Получить XML из колонки в таблице и взять конкретное значение MSSQL
Есть таблица, где в одной из колонок хранятся настройки в виде XML. Мне нужно получить значение <Timeout type="Type3">19.09.2016 0:05:00</Timeout>, а именно только минуты и секунды.
Вот весь XML:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ObjectSerialization>
<!--Persistent object serialization-->
<Root>
<ComponentType type="Type0" />
<ConsiderDuration type="Type1">False</ConsiderDuration>
<ConsiderDurationEmptySlot type="Type1">False</ConsiderDurationEmptySlot>
<Enabled type="Type1">False</Enabled>
<ExternalRecordType type="Type2">Hard</ExternalRecordType>
<SiteEnabled type="Type1">False</SiteEnabled>
<Timeout type="Type3">19.09.2016 0:05:00</Timeout>
<UsedTypes>
<Type0 type="Kosta.PersistentObjects.SystemProperty.AppointmentProperty, Kosta.PersistentObjects" />
<Type2 type="Kosta.PersistentObjects.SystemProperty.ExternalRecordType, Kosta.PersistentObjects" />
<Type1 type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<Type3 type="System.DateTime, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
</UsedTypes>
</Root>
Для начала я пытаюсь получить значение в Timeout следующим образом
declare @info xml
set @info = Convert(xml,(select [Value] FROM [SystemPropertyStorage] where Name = 48),2)
select b.value('@Timeout', 'DateTime') as FullDate
from @info.nodes('/Root/Timeout') as a(b)
Но возвращается NULL
Что здесь не так ?
Ответы (1 шт):
Что здесь не так ?
Если сложить селекторы для nodes и value, то полный селектор будет /Root/Timeout/@Timeout, но искомое значение лежит в тексте элемента Timeout, а не в атрибуте.
Вообще было бы проще, если бы в XML дата и время лежали в формате yyyy-mm-ddThh:mi:ss (ISO 8601)
<Root>
...
<Timeout type="Type3">2016-09-19T00:05:00</Timeout>
...
</Root>
Тогда получить дату/время было бы очень просто
DECLARE @dateTime datetime2(0);
SET @dateTime = @info.value('(/Root/Timeout/text())[1]', 'datetime2(0)');
В данном же случае придётся сделать промежуточное преобразование в строку, и уже строку конвертировать в дату/время (используя формат 104, см. документацию)
DECLARE @dateTimeStr nvarchar(50), @dateTime datetime2(0);
SET @dateTimeStr = @info.value('(/Root/Timeout/text())[1]', 'nvarchar(50)');
SET @dateTime = TRY_CONVERT(datetime2(0), @dateTimeStr, 104);
И, затем
SELECT
DATEPART(MINUTE, @dateTime) AS [Minutes],
DATEPART(SECOND, @dateTime) AS [Seconds];