我无法找到以下SQL查询的解决方案:
我有一个包含2个日期列的表:PurchaseDate
和RefundDate
我有一个StartDate
和EndDate
,用于定义查询的日期范围。
我想通过PurchaseDate
或RefundDate
最早来限制查询。此日期也可以为空。
因此,如果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子句中的一些聪明的魔法做到....
答案 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