首页 文章

在SQL中按日期排序

提问于
浏览
4

我有一个资源表,其中一个字段是日期字段,其数据类型为日期 . 我想要输出以下内容:

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

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

  • 六月记录

  • 七月记录

  • 八月记录

  • 九月记录

  • 十月记录

  • 十一月记录

  • 十二月记录

  • 1月份记录

  • 二月份记录

  • 三月记录

  • 四月记录

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

  • 七月记录

  • 八月记录

  • ......

这是我的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 回答

  • 0

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

  • 4

    我认为这样的事情可能就是你想要的:

    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

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

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

    6月,7月将是0等

  • 0
    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

    您应该能够使用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)
    
  • 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);
    

    希望它有所帮助......

相关问题