Сортировать по дате в SQL - PullRequest
4 голосов
/ 01 июня 2011

У меня есть таблица ресурсов, одно из полей - поле даты с типом данных даты. Я хочу иметь следующий вывод:

Записи текущего месяца (скажем, май - год не важен)

Затем следующее (опять же, при условии, что май - текущий месяц)

  • Июньские записи
  • Отчеты за июль
  • Отчеты за август
  • сентябрьские отчеты
  • Октябрьские Отчеты
  • Ноябрьские отчеты
  • Отчеты за декабрь
  • Январские отчеты
  • Февральские записи
  • Мартовские отчеты
  • Апрельские записи

Наступает июнь, июнь - текущий месяц, и тогда порядок будет:

  • Отчеты за июль
  • Отчеты за август
  • ...

Вот мой SQL ... Я не знаю, как ЗАКАЗАТЬ вывод для достижения желаемого порядка (5,6,7,8,9,10,11,12,1,2,3,4) :

SELECT
  resource_id,
  resource_title,
  resource_summary,
  resource_category,
  resource_status,
  resource_date,
  DATEPART(month, resource_date) AS resource_month,
  DATEPART(day, resource_date) AS resource_day
FROM dbo.resources
WHERE (resource_category = N'Quotes')
  AND (resource_status <> N'Draft')

Я нашел это возможное решение для MySQL:

Мне нужны необычные результаты заказа mysql

но мне чего-то не хватает.

Ответы [ 6 ]

4 голосов
/ 01 июня 2011
ORDER BY
  (MONTH(resource_date) - MONTH(GETDATE()) + 12) % 12,
  DATEADD(year, YEAR(GETDATE()) - YEAR(resource_date), resource_date),
  YEAR(resource_date)

Первый член устанавливает первичный заказ на месяц resource_date (текущий месяц будет первым, предыдущий, последним).Второй термин заказывает временные метки в течение месяца независимо от года даты.Если ваши даты не содержат временных частей или если они не имеют никакого значения, вы можете заменить их на DAY(resource_date).Наконец, последний член учитывает год для других идентичных дат (также может быть просто resource_date).

0 голосов
/ 01 июня 2011

Я предполагаю, что в "resource_date" есть год - не так ли?В этом случае вы можете просто отфильтровать и заказать по

WHERE resource_date >= getdate()
  AND resource_date < DATEADD(year,1,getdate())
ORDER BY resource_date;

Если нет года (или, точнее, разных неизвестных лет), вы можете сделать это:

ORDER BY
    CASE
    WHEN DATEADD(year,-year(resource_date),resource_date) <
         DATEADD(year,-year(getdate()),getdate())
    THEN 1
    ELSE 0
    END ASC,
    DATEADD(year,-year(resource_date),resource_date);

Надеюсь, это помогло...

0 голосов
/ 01 июня 2011

Вы должны иметь возможность адаптировать решение MySQL, используя DATEPART вместо DATE_FORMAT:

SELECT resource_id, resource_title, resource_summary, resource_category, resource_status, resource_date, DATEPART(month, resource_date) AS resource_month, DATEPART(day, resource_date) AS resource_day
FROM dbo.resources
WHERE (resource_category = N'Quotes') AND (resource_status <> N'Draft')
ORDER BY DATEPART(month, resource_date) < DATEPART(month, GETDATE()),
         DATEPART(month, resource_date)

У меня нет под рукой SQL Server, поэтому я 'я не уверен, будет ли он доволен логическим значением в предложении ORDER BY.Если ему не нравится логическое значение ORDER BY, то CASE должен выполнить трюк:

ORDER BY
    CASE WHEN DATEPART(month, resource_date) < DATEPART(month, GETDATE())
        THEN 0
        ELSE 1
    END,
    DATEPART(month, resource_date)
0 голосов
/ 01 июня 2011

Как насчет ORDER BY (DATEPART(month,resource_date) - (DATEPART(month,getdate() -1)) % 12)

Итак, в мае (5-й месяц) вы заказываете по месяцу в строке -6 (мод 12).Итак, июнь (6-й месяц) будет 0, июль (7) будет 1.

В июне июль будет 0 и т. Д.

0 голосов
/ 01 июня 2011

Я думаю, что-то вроде этого может быть тем, что вы ищете:

SELECT
  resource_id,
  resource_title,
  resource_summary,
  resource_category,
  resource_status,
  resource_date
FROM
  dbo.resources
WHERE
  resource_date >= DATE_FORMAT(NOW() ,'%Y-%m-01') AND
  resource_date < DATE_FORMAT(DATE_ADD(NOW(), INTERVAL 1 YEAR) ,'%Y-%m-01')
ORDER BY
  resource_date;
0 голосов
/ 01 июня 2011

Будет ли у вас работать?
ORDER BY<br> CASE DATEPART(month, resource_date)<br> WHEN 5 THEN 0<br> WHEN 6 THEN 1<br> ... etc<br> END

...