在SQL中按日期排序

时间:2011-06-01 03:04:17

标签: sql sql-server sql-server-2008 sql-order-by

我有一个资源表,其中一个字段是数据类型为date的日期字段。我想要关注输出:

当前月份记录(比如五月 - 一年并不重要)

然后以下(再次假设五月是当月)

  • 六月唱片
  • 七月记录
  • August Records
  • 九月记录
  • 十月记录
  • 十一月记录
  • 12月唱片
  • 1月份记录
  • 二月纪录
  • March Records
  • April Records

六月,六月是当月,订单将是:

  • 七月记录
  • August Records
  • ...

这是我的SQL ...我不知道如何对输出进行ORDER以达到所需的顺序(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的可能解决方案:

  

I need unusual ordering mysql results

但是我遗漏了一些东西。

6 个答案:

答案 0 :(得分:4)

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)。

答案 1 :(得分:0)

它会对你有用吗? ORDER BY
CASE DATEPART(month, resource_date)
WHEN 5 THEN 0
WHEN 6 THEN 1
... etc
END

答案 2 :(得分:0)

我认为这样的事情可能就是你要找的东西:

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;

答案 3 :(得分:0)

如何'回合ORDER BY (DATEPART(month,resource_date) - (DATEPART(month,getdate() -1)) % 12)

因此,在5月(第5个月),您按行-6(模12)中的月份进行排序。因此,6月(第6个月)将为0,7月(7)将为1。

6月,7月将是0等。

答案 4 :(得分:0)

您应该可以使用DATEPART代替DATE_FORMAT来调整MySQL解决方案:

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)

答案 5 :(得分:0)

我假设“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);

希望它有所帮助...