Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 日期类型的XML子代的最小值_Sql Server_Xml_Tsql_Xquery Sql - Fatal编程技术网

Sql server 日期类型的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

如何在XML字段中查询所有子体的最小日期。大概是这样的:

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