按月分类的SQL顺序,最接近现在的日期

Rum*_*ser 2 sql sql-server datetime date sql-order-by

我正在写一份声明来提取最快到期的账户.我的查询目前按月和日排序,因为年份无关紧要.无论如何将当前月份和日期设置为最高值?而不是jan 01?

SELECT *
FROM clients
WHERE LiveDate IS NOT NULL
Order by DATEPART(month, LiveDate), DATEPART(day, LiveDate)
Run Code Online (Sandbox Code Playgroud)

我是否只需要将其拆分为两个查询,一个在当前月份之后查找,一个查找之前,并加入它们以便它们的顺序正确

例:

date founded || Annual function
01/01/2011   || beach outing
11/03/2010   || family day
23/03/2009   || Movies
05/04/2000   || Girls night out
10/05/2005   || Cricket function
29/07/2011   || candle lit formal dining
30/07/2008   || childrens day
04/08/2005   || board games day
03/012/2006  || pizza night
20/012/2001  || camping trip
Run Code Online (Sandbox Code Playgroud)

因为这是一年一度的郊游并不重要.我想按照最接近现在直到今年年底,然后从年初到今天的事件的顺序将它们拉出来.

因此,结果将基于当前日期:23/06/2011

date founded || Annual function 
29/07/2011   || candle lit formal dining 
30/07/2008   || childrens day 
04/08/2005   || board games day 
03/012/2006  || pizza night 
20/012/2001  || camping trip              _ _ _ _ _ _ _ New year _ _ _ _ _  
01/01/2011   || beach outing 
11/03/2010   || family day 
23/03/2009   || Movies 
05/04/2000   || Girls night out 
10/05/2005   || Cricket function
Run Code Online (Sandbox Code Playgroud)

And*_*y M 8

SELECT *
FROM clients
WHERE LiveDate IS NOT NULL
ORDER BY ABS(DATEDIFF(day, LiveDate, GETDATE())
Run Code Online (Sandbox Code Playgroud)

UPDATE

抱歉,起初没有得到它,在排序时应该考虑到当前日期和月份的接近程度,而不是年份.

所以也许是这样的:

SELECT *
FROM clients
WHERE LiveDate IS NOT NULL
ORDER BY
  ABS(
    DATEDIFF(
      day,
      DATEADD(year, DATEDIFF(year, LiveDate, GETDATE()), LiveDate),
      GETDATE()
    )
  )
Run Code Online (Sandbox Code Playgroud)


更新2

根据提供的示例,这应该做的工作:

…
ORDER BY
  (MONTH(LiveDate) - MONTH(GETDATE()) + 12) % 12,
  DATEADD(year, YEAR(GETDATE()) - YEAR(LiveDate), LiveDate),
  YEAR(LiveDate)
Run Code Online (Sandbox Code Playgroud)