Sql server 日期类型的XML子代的最小值
如何在XML字段中查询所有子体的最小日期。大概是这样的:Sql server 日期类型的XML子代的最小值,sql-server,xml,tsql,xquery-sql,Sql Server,Xml,Tsql,Xquery Sql,如何在XML字段中查询所有子体的最小日期。大概是这样的: DECLARE @xml XML =' <Plan> <EffectiveDate>2006-01-01</EffectiveDate> <EffectiveDate>2016-09-14</EffectiveDate> <EffectiveDate>2016-09-14</EffectiveDate> <Effect
DECLARE @xml XML ='
<Plan>
<EffectiveDate>2006-01-01</EffectiveDate>
<EffectiveDate>2016-09-14</EffectiveDate>
<EffectiveDate>2016-09-14</EffectiveDate>
<EffectiveDate>2016-09-14</EffectiveDate>
</Plan>'
SELECT @xml.value('min(descendant::EffectiveDate)','varchar(max)') minDate
,@xml.value('count(descendant::EffectiveDate)','varchar(max)') countDate
不幸的是,上面为MIN返回空值请尝试此操作。我不认为这是最好的解决办法,我期待在这里看到更好的解决办法。但它会给你想要的。 编辑了我更喜欢的第二个
DECLARE @x XML ='
<Plan>
<EffectiveDate>2006-01-01</EffectiveDate>
<EffectiveDate>2016-09-14</EffectiveDate>
<EffectiveDate>2016-09-14</EffectiveDate>
<EffectiveDate>2016-09-14</EffectiveDate>
</Plan>';
SELECT
Min(a.EffDate) AS MinDate
, Count(a.EffDate) AS CountDate
FROM
(
SELECT
EffDate.value('.','DATE') AS EffDate
FROM
@x.nodes('/Plan/EffectiveDate') AS Plans(EffDate)
)a;
这是第一个
DECLARE @x XML ='
<Plan>
<EffectiveDate>2006-01-01</EffectiveDate>
<EffectiveDate>2016-09-14</EffectiveDate>
<EffectiveDate>2016-09-14</EffectiveDate>
<EffectiveDate>2016-09-14</EffectiveDate>
</Plan>';
DECLARE @DocHandle INT;
EXEC sp_XML_PrepareDocument @DocHandle OUTPUT, @x;
SELECT Min(a.EffDate) AS MinDate
, Count(a.EffDate) AS CountDate
FROM
(
SELECT *
FROM OPENXML(@DocHandle,'/Plan/EffectiveDate')
WITH (EffDate NVARCHAR(50) '.')
) a
EXEC sp_XML_RemoveDocument @DocHandle;
最简单的方法是:
DECLARE @xml XML ='
<Plan>
<EffectiveDate>2006-01-01</EffectiveDate>
<EffectiveDate>2016-09-14</EffectiveDate>
<EffectiveDate>2016-09-14</EffectiveDate>
<EffectiveDate>2016-09-14</EffectiveDate>
</Plan>'
SELECT MIN(t.v.value('.','date')) minDate,
COUNT(t.v.value('.','date')) countDate
FROM @xml.nodes('//Plan/EffectiveDate') as t(v)
非类型化xml节点值的默认数据类型是xdt:untypedAtomic。m将尝试将xdt:untypedAtomic值转换为xs:double,然后返回最小值。您的值无法转换为xs:double,因此min将返回四个空值的min值 因为min在xs:date上工作得很好,所以可以首先将值转换为xs:date,然后对日期值执行min 声明@xml= 2006-01-01 2016-09-14 2016-09-14 2016-09-14 '; 在substant::EffectiveDate/text中为$n选择@xml.value'min 返回$n强制转换为xs:date?,'date', @value'countsubstant::EffectiveDate','int';
我相信这是因为SQL Server不了解您在此处排序的顺序,因此它无法为您提供最大和最小值。如果您将标记的内容替换为数字1、4、2、3而不是2006-01-01,…,您将看到它将返回最小值。谢谢大家。每个答案都很有魅力。我选择了Mikael,因为我需要用XML列和他的方式查询一个表,我不必做交叉应用。我不确定从性能角度看哪种方式是最好的方式,因为我正在使用真正的小样本数据集进行测试。我想时间会证明一切。谢谢。
minDate countDate
2006-01-01 4