我有一个资源表,其中一个字段是数据类型为date的日期字段。我想要关注输出:
当前月份记录(比如五月 - 一年并不重要)
然后以下(再次假设五月是当月)
六月,六月是当月,订单将是:
这是我的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的可能解决方案:
但是我遗漏了一些东西。
答案 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);
希望它有所帮助...