mysql - 获取优惠的具体日期

标签 mysql sql tsql

我需要在一个 SQL 查询中获取所有优惠的具体日期。我不知道在这些条件下如何做到这一点:

  1. 如果有有效报价,我需要有效期间的开始/结束日期
  2. 如果有过期的优惠,我需要最后开始日期/结束日期
  3. 如果有 future 优惠,我需要第一个开始日期/结束日期

餐 table 优惠:

OfferID Name
10      Current Offer
20      Expired Offer
30      Coming Offer

表报价日期:(NULL = 无限报价)

OfferID StartDate   EndDate
10      2000-01-01  2009-12-31
10      2010-01-01  NULL        //Need this (1.)
20      1900-01-01  1900-12-31
20      1901-01-01  1901-12-31  //Need this (2.)
30      2030-01-01  2030-12-31  //Need this (3.)
30      2031-01-01  NULL

结果应该是:

OfferID Name    StartDate   EndDate
10      Current 2010-01-01  NULL
20      Expired 1901-01-01  1901-12-31
30      Coming  2030-01-01  2030-12-31

这将为我提供有效报价 (1.):

SELECT o.Name, d.StartDate, d.EndDate FROM Offer AS o
LEFT JOIN OfferDates AS d ON o.OfferID = d.OfferID
WHERE d.StartDate <= GETDATE() AND (d.EndDate IS NULL OR d.EndDate > GETDATE())

希望有人能帮助我!

谢谢!

最佳答案

我成功了!

SELECT DISTINCT 
o.Name,  
ISNULL(curr.StartDate, ISNULL(fut.StartDate, hist.StartDate)) AS 'StartDate', --Only get "NOT NULL-StartDate"
ISNULL(curr.EndDate, ISNULL(fut.EndDate, hist.EndDate)) AS 'EndDate' --Only get "NOT NULL-EndDate"

FROM Offer AS o

-- Current
LEFT JOIN (SELECT * FROM OfferDates WHERE StartDate <= GETDATE() AND (EndDate IS NULL OR  EndDate > GETDATE())) AS curr ON (o.OfferID = curr.OfferID)

-- Expired
LEFT JOIN (SELECT OfferID, MAX(EndDate) AS EndDate FROM OfferDates WHERE EndDate < GETDATE()  AND EndDate IS NOT NULL GROUP BY OfferID)AS tmpHist ON (o.OfferID = tmpHist.OfferID)
LEFT JOIN (SELECT * FROM OfferDates WHERE OfferID NOT IN (SELECT OfferID FROM OfferDates WHERE EndDate >= GETDATE() OR EndDate IS NULL)) AS hist ON (tmpHist.OfferID = hist.OfferID AND tmpHist.EndDate = hist.EndDate)

-- Future
LEFT JOIN (SELECT OfferID, MIN(StartDate) AS StartDate FROM OfferDates WHERE StartDate > GETDATE() GROUP BY OfferID) AS tmpFut ON (o.OfferID = tmpFut.OfferID)
LEFT JOIN (SELECT * FROM OfferDates WHERE OfferID NOT IN (SELECT OfferID FROM OfferDates WHERE StartDate <= GETDATE())) AS fut ON (tmpFut.OfferID = o.OfferID AND tmpFut.StartDate = fut.StartDate)                   

关于mysql - 获取优惠的具体日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18249930/

相关文章:

mysql - 如何从MySQL中的文本字段中提取两个连续的数字?

mysql - 在 HQL 中减去子选择值

sql-server - T-SQL : Conditionally joining using a parameter

c# - LINQ 和 SQL 中看似等效的查询返回不同的结果

最佳匹配的MySQL搜索算法

sql-server - 当IDENTITY_INSERT设置为ON时,必须为表中的标识列指定显式值

sql - 如何选择两个日期之间的所有时间?

mysql - 如何处理 sql.ErrTxDone

php - 如何在CodeIgniter Datamapper中使用cascade_delete配置选项

sql - 从查询结果中选择?