2016-07-14 29 views
0

我有一个客户和门票的数据库。门票日期范围从2007年到2017年的将来日期。我想运行一个查询,为我提供过去最近的门票和未来最近的门票。如何根据SQL中的GETDATE()输出最后和下一个日期

我最初下面的查询给了我他们的第一次门票和他们的出票日期最远的未来 - 但我想沿着线的东西:

MAX(EVENTDATE),其中(EVENTDATE < GETDATE()) AS LastDate和类似MIN(eventdate)where(eventdate < getdate())AS NEXTDate但我真的不知道如何。据推测它会涉及子查询?

SELECT  MAX(Dwh.DimEvents.devEventDate) AS Last_Show, MIN(Dwh.DimEvents.devEventDate) AS First_Show, Dwh.DimClients.dcClientCode, Dwh.DimClients.dcFirstName, Dwh.DimClients.dcLastName 
FROM  Dwh.FactTickets LEFT OUTER JOIN 
        Dwh.DimClients ON Dwh.DimClients.dcClientGUID = Dwh.FactTickets.ftClientGuid LEFT OUTER JOIN 
        Dwh.DimEvents ON Dwh.DimEvents.devGuid = Dwh.FactTickets.ftEventGuid LEFT OUTER JOIN 
        Dwh.DimShows ON Dwh.DimEvents.devShowGuid = Dwh.DimShows.dshGuid 
WHERE  (Dwh.FactTickets.ftTicketStatus = 1) 
GROUP BY Dwh.DimClients.dcClientCode, Dwh.DimClients.dcFirstName, Dwh.DimClients.dcLastName 

回答

0

尝试这样的事情..不要忘记测试查询的性能..

SELECT 
(
Select MAX(DimEvents.devEventDate) 
from DimEvents INNER JOIN FactTickets ON DimEvents.devGuid = FactTickets.ftEventGuid 
and DimClients.dcClientGUID = FactTickets.ftClientGuid and DimEvents.devEventDate < GetDate() 
and FactTickets.ftTicketStatus = 1 
) AS MostRecentPast, 

(
Select MIN(DimEvents.devEventDate) 
from DimEvents INNER JOIN FactTickets ON DimEvents.devGuid = FactTickets.ftEventGuid 
and DimClients.dcClientGUID = FactTickets.ftClientGuid and DimEvents.devEventDate > GetDate() 
and FactTickets.ftTicketStatus = 1 
) AS ClosestInFuture, 
DimClients.dcClientCode, DimClients.dcFirstName, DimClients.dcLastName 
FROM DimClients 
GROUP BY DimClients.dcClientCode, DimClients.dcFirstName, DimClients.dcLastName 
+0

嗨Jawad,这似乎没有工作,因为它一直告诉我,'Dwh.FactTickets.ftEventGuid'在选择列表中是无效的,因为它不包含在聚合函数或GROUP BY子句中。我尝试在Group By中添加,但之后它只列出了每个人的每个事件 – wolfgang

+0

我不认为您需要Group By,因为我们已经将聚合函数转换为子选择。由于我没有完整的数据库结构,因此无法在此处进行测试。 –

+0

不幸的是,虽然删除Group By行允许它运行,它仍然给我所有的票日期,而不仅仅是最后一个和下一个。 – wolfgang

0

你可以得到日期最近的过去的机票和不久的将来,机票就像这样:

DECLARE @TargetDate datetime 
SELECT @TargetDate = getdate() 

SELECT MAX(TimeColumn) FROM table WHERE TimeColumn < @TargetDate 

SELECT MIN(TimeColumn) FROM table WHERE TimeColumn > @TargetDate 

然后,您可以嵌入这些子查询,像这样:

SELECT 
    TicketColumn1, 
    TicketColumn2, 
    TicketColumn3, 
    etc 
FROM 
    TicketTable 
WHERE 
    TimeColumn = (SELECT MAX(TimeColumn) FROM table WHERE TimeColumn < @TargetDate) 
    or TimeColumn = (SELECT MIN(TimeColumn) FROM table WHERE TimeColumn > @TargetDate) 
相关问题