在日期之间选择SQL XML元素

时间:2012-04-03 14:45:37

标签: sql xml filtering

我在一个带有XML数据类型列的SQL表中有一些数据,我需要返回一个属于日期范围的元素列表。数据如下所示:

文件夹表 - TBL文件夹: id - GUID ClientId = GUID CreatedDate:DateTime 内容:xml

内容xml的结构如下:

<Contents>
  <Files>
   <File id="SOMEGUID">
   <StartDate>2001-11-07</StartDate>
   <EndDate>2062-11-14</EndDate>
   <Type code="jpeg">JPEG</Type>
   <Valid>true</Valid>
   </File>
   <File id="SOMEGUID">
   <StartDate>2012-09-01</StartDate>
   <EndDate>2065-11-14</EndDate>
   <Type code="jpeg">JPEG</Type>
   <Valid>true</Valid>
   </File>
   Files etc......
</Files>
</Contents>

我在存储过程中写这个,我传入客户端GUID以及开始和结束日期 我正在使用一个xml列,其中包含介于最新文件夹记录的日期范围之间的所有文件:

这是我到目前为止所做的:

Select top 1 folder.contents.query('Contents/File/File
from TBLFolder
where clientID = @clientId
order by CreatedDate desc
For XML PATH ('Files')

过滤xml中的Files节点以仅显示介于start和end参数之间的文件的最佳方法是什么? 我是SQL新手,因此不确定解决这个问题的最佳方法。

我已经尝试了FLOWER语句并对我的查询进行了谓词,但是在日期时间和转换方面遇到了问题,我也得到了p1:p2:前缀出现在我的元素上。

我所追求的输出是:

<Files>
       <File id="SOMEGUID">
       <StartDate>2001-11-07</StartDate>
       <EndDate>2062-11-14</EndDate>
       <Type code="jpeg">JPEG</Type>
       <Valid>true</Valid>
       </File>
       <File id="SOMEGUID">
       <StartDate>2012-09-01</StartDate>
       <EndDate>2065-11-14</EndDate>
       <Type code="jpeg">JPEG</Type>
       <Valid>true</Valid>
       </File>
       Files etc......
    </Files>

1 个答案:

答案 0 :(得分:1)

DECLARE @x XML 
SET @x='<Files>
       <File id="SOMEGUID">
       <StartDate>2001-11-07</StartDate>
       <EndDate>2062-11-14</EndDate>
       <Type code="jpeg">JPEG</Type>
       <Valid>true</Valid>
       </File>
       <File id="SOMEGUID">
       <StartDate>2001-11-08</StartDate>
       <EndDate>2065-11-14</EndDate>
       <Type code="jpeg">JPEG</Type>
       <Valid>true</Valid>
       </File>
        <File id="SOMEGUID">
       <StartDate>2001-11-19</StartDate>
       <EndDate>2065-11-14</EndDate>
       <Type code="jpeg">JPEG</Type>
       <Valid>true</Valid>
       </File>
    </Files>'

    edited...

    SELECT @x.query('
for $i in /Files/File
where $i/StartDate < ''2001-11-19''
return $i
') as Resu 

将产生:

enter image description here