【问题标题】:Sort by Date in SQLSQL中按日期排序
【发布时间】:2011-06-01 03:04:17
【问题描述】:

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

当前月份记录(比如 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 找到了这个可能的解决方案:

I need unusual ordering mysql results

但我错过了一些东西。

【问题讨论】:

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


    【解决方案1】:
    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)。

    【讨论】:

    • 好的,这是我尝试的第一个建议。在 MS SQL 中,它正确列出了记录。当我将结果输出到网页时,顺序不正确。这是一个示例:americanspeaker.com/beta/members/sample.asp
    • 这里是 MS SQL 中的 SQL SELECT TOP (100) PERCENT resource_id, resource_title, resource_summary, resource_source, resource_date, resource_category, resource_status FROM dbo.resources WHERE (resource_category = N'Quotes') AND (NOT (resource_status = N'Draft')) ORDER BY (MONTH(resource_date) - MONTH(GETDATE()) + 12) % 12, DAY(resource_date)
    • 这是从数据库中提取的代码 Dim rs_quotes Dim rs_quotes_cmd Dim rs_quotes_numRows Set rs_quotes_cmd = Server.CreateObject ("ADODB.Command") rs_quotes_cmd.ActiveConnection = MM_americanspeaker_STRING rs_quotes_cmd.CommandText = "SELECT * FROM dbo .qry_resources_quotes" rs_quotes_cmd.Prepared = true 设置 rs_quotes = rs_quotes_cmd.Execute rs_quotes_numRows = 0
    • 如果您想要保证顺序,则应将 ORDER BY 应用于最终查询。您不能依赖 dbo.qry_resources_quotes 定义中的 ORDER BY 子句(我假设它是由上一个查询定义的 SELECT TOP (100) PERCENT... 之一)。
    • 有效!惊人的。我过去曾遇到过 ORDER BY 问题。这是 MS SQL 中的错误还是我对 SQL 和 MS SQL Server 不了解的问题?
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      我认为您可能正在寻找这样的东西:

      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;
      

      【讨论】:

        【解决方案4】:

        ORDER BY (DATEPART(month,resource_date) - (DATEPART(month,getdate() -1)) % 12)怎么样

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

        六月,七月将是 0,等等。

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            【解决方案6】:

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

            希望对您有所帮助...

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2012-01-15
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-08-09
              • 2012-09-09
              • 2021-08-13
              • 1970-01-01
              相关资源
              最近更新 更多