【问题标题】:Selecting SQL XML element between Dates在日期之间选择 SQL XML 元素
【发布时间】:2012-04-17 05:59:21
【问题描述】:

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

文件夹表 - TBL 文件夹: id - GUID ClientId = GUID 创建日期:日期时间 内容: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 中的 XML 新手,所以不确定解决这个问题的最佳方法。

我在查询中尝试了 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>

【问题讨论】:

    标签: sql xml filtering


    【解决方案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 
    

    将产生:

    【讨论】:

    • 在 where 子句中使用了哪个元素?开始日期还是结束日期?
    猜你喜欢
    • 2012-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-04
    • 1970-01-01
    • 2013-12-27
    • 1970-01-01
    • 2011-07-04
    相关资源
    最近更新 更多