问题描述
|
我有一个资源表,其中一个字段是带有日期数据类型的日期字段。我要输出以下内容:
当前月份记录(例如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);
希望它能帮助...