在SQL中按日期排序

问题描述

| 我有一个资源表,其中一个字段是带有日期数据类型的日期字段。我要输出以下内容: 当前月份记录(例如5月-年并不重要) 然后是以下内容(同样,假设5月为当前月份) 六月纪录 七月纪录 八月唱片 九月纪录 十月纪录 十一月唱片 十二月纪录 一月纪录 二月纪录 三月纪录 四月纪录 到六月,六月是当前月份,然后顺序是: 七月纪录 八月唱片 ... 这是我的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结果 但我想尽一切办法。     

解决方法

        
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)
代替。最后,最后一个学期将年份考虑在内,否则其他日期相同(也可以简单地称为“2ѭ”)。     ,        对您有用吗?
ORDER BY
CASE DATEPART(month,resource_date)
WHEN 5 THEN 0
WHEN 6 THEN 1
... etc
END
    ,        我认为您正在寻找类似这样的东西:
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;
    ,        
ORDER BY (DATEPART(month,resource_date) - (DATEPART(month,getdate() -1))  % 12)
因此,在5月(第5个月),您需要按第-6行(mod 12)中的月份进行订购。因此,6月(第6个月)将为0,7月(7)将为1。 6月,7月将为0,依此类推。     ,        您应该能够使用ѭ8代替
DATE_FORMAT
来适应MySQL解决方案:
SELECT resource_id,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()),resource_date)
我没有SQL Server,所以我不确定它是否会对ORDER BY子句中的布尔值满意。如果它不喜欢布尔型ORDER BY,那么CASE应该可以解决问题:
ORDER BY
    CASE WHEN DATEPART(month,GETDATE())
        THEN 0
        ELSE 1
    END,resource_date)
    ,        我假设\ 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,resource_date);
希望它能帮助...