SQL Server最大和最小日期在行中

时间:2017-02-11 22:56:09

标签: sql-server date max row

我的SQL Server表在同一行中有200个日期:

ID  Date1  Data2  Date3  (..)  Date200

是否可以找到一行的最小和最大日期?

由于

1 个答案:

答案 0 :(得分:0)

一种方法是使用CROSS APPLY取消行。 无需列出200个日期列(请注意attr.value('local-name(.)','varchar(100)') Like 'Date%')。

您可能还会注意到NULL将被省略。

示例

Declare @YourTable table (ID int,Date1 date,Date2 date,Date3 date)
Insert into @YourTable values
(1,'2016-01-01','2016-01-15','2016-02-01'),
(2,'2016-02-15',null,null)

Select A.ID
      ,C.*
 From  @YourTable A
 Cross Apply (Select XMLData=cast((Select A.* For XML RAW) as xml)) B
 Cross Apply (
            Select MinDate = min(Value)
                  ,MaxDate = max(Value)
                 From  (
                        Select Value  = attr.value('.','date') 
                         From  B.XMLData.nodes('/row') as A(r)
                         Cross Apply A.r.nodes('./@*') AS B(attr)
                         Where attr.value('local-name(.)','varchar(100)') Like 'Date%'
                       ) S
             ) C

<强>返回

ID  MinDate     MaxDate
1   2016-01-01  2016-02-01
2   2016-02-15  2016-02-15

修改 - 另一个选项

Select A.ID
      ,C.*
 From  @YourTable A
 Cross Apply (
            Select MinDate = min(Value)
                  ,MaxDate = max(Value)
                 From  (values (A.Date1)
                              ,(A.Date2)
                              ,(A.Date3)
                              -- .. More Columns
                       ) C1 (Value)
             ) C