在SQL中查找2个日期列的最新日期

时间:2013-12-06 15:02:44

标签: sql date sql-server-2012

我无法找到以下SQL查询的解决方案:

我有一个包含2个日期列的表:PurchaseDateRefundDate

我有一个StartDateEndDate,用于定义查询的日期范围。

我想通过PurchaseDateRefundDate 最早来限制查询。此日期也可以为空。

因此,如果PurchaseDate是18.Nov.2013而RefundDate是03.Dec.2013,那么我想在PurchaseDate子句中使用where来限制startDate中的结果集和EndDate

另一个例子,如果PurchaseDate是01.Aug.2013而RefundDate是19.May.2013,那么我想在where子句中使用RefundDate。

这是我到目前为止所得到的但不正确,我需要选择两个日期中最早的两个来限制where子句:

SELECT OrderID, AddressID, PurchaseDate, RefundDate
FROM
Orders
WHERE
(PurchaseDate IS NOT NULL AND PurchaseDate >= @queryStartDate 
   AND  PurchaseDate <= @queryEndDate) OR
 (RefundDate IS NOT NULL AND RefundDate >= @queryStartDate 
       AND  RefundDate <= @queryEndDate)

我考虑使用COALESCE,但这不会起作用,因为它只选择非空的第一个日期而不是最早的日期。

我想我将不得不做两个查询并将它们联合起来,但感觉有更好的方法,我可以用一个查询和where子句中的一些聪明的魔法做到....

3 个答案:

答案 0 :(得分:2)

您可以通过在逻辑中使用其他子句来完成此操作:

SELECT OrderID, AddressID, PurchaseDate, RefundDate
FROM Orders o
WHERE (PurchaseDate IS NOT NULL and
       PurchaseDate <= coalesce(RefundDate, PurchaseDate) and
       PurchaseDate between @queryStartDate AND @queryEndDate
      ) or
      (RefundDate IS NOT NULL and
       RefundDate <= coalesce(PurchaseDate, RefundDate and
       RefundDate between @queryStartDate AND @queryEndDate
      );

如果列上有索引,union方法可能会更快(即使重复删除)。

答案 1 :(得分:0)

case是你的朋友......而不是合并,写一下

 case when PurchaseDate < RefundDate 
       then PurchaseDate else RefundDate end

因此,您的查询变为:

 SELECT OrderID, AddressID, PurchaseDate, RefundDate
 FROM Orders
 WHERE case when PurchaseDate < RefundDate 
            then PurchaseDate else RefundDate end 
       Between @queryStartDate And @queryEndDate

答案 2 :(得分:0)

我认为这与使用最少功能一样简单。

SELECT OrderID, AddressID, PurchaseDate, RefundDate
FROM Orders
WHERE least( PurchaseDate , RefundDate ) Between @queryStartDate And @queryEndDate