Порядок SQL по месяцам, дням ближайшим к настоящему - PullRequest
2 голосов
/ 10 мая 2011

Я пишу заявление, чтобы забрать счета, которые должны быть в ближайшее время.Мой запрос в настоящее время сортируется по месяцу и дню, поскольку год не имеет значения.Можно ли в любом случае установить текущий месяц и день как самые верхние значения?вместо января 01?

SELECT *
FROM clients
WHERE LiveDate IS NOT NULL
Order by DATEPART(month, LiveDate), DATEPART(day, LiveDate)

Нужно ли мне просто разбить его на два запроса: один ищет после текущего месяца, другой - раньше, и объединить их, чтобы они были в правильном порядке

ПРИМЕР:

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

Поскольку это годовой выходной, год не имеет значения.Я хочу вывести их в порядке ближайшего к настоящему моменту события до конца года, затем с начала года до сегодняшнего дня.

, поэтому результаты будут в этом порядке на основе текущегодень: 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

Ответы [ 2 ]

7 голосов
/ 10 мая 2011
SELECT *
FROM clients
WHERE LiveDate IS NOT NULL
ORDER BY ABS(DATEDIFF(day, LiveDate, GETDATE())

UPDATE

Извините, сначала не понял, что при сортировке должна учитываться только близость к текущему дню и месяцу, но не к году.

Так может быть так:

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


ОБНОВЛЕНИЕ 2

Основываясь на предоставленных примерах, это должно сделать работу:

…
ORDER BY
  (MONTH(LiveDate) - MONTH(GETDATE()) + 12) % 12,
  DATEADD(year, YEAR(GETDATE()) - YEAR(LiveDate), LiveDate),
  YEAR(LiveDate)
0 голосов
/ 03 ноября 2015

Если вы не хотите исторических результатов, просто добавьте это:

WHERE LiveDate >= GETDATE()...
...