如何根据日期对SQL Server中的多个列进行排序

Posted

技术标签:

【中文标题】如何根据日期对SQL Server中的多个列进行排序【英文标题】:How to sort multiple columns in SQL Server according to the date 【发布时间】:2016-02-09 23:37:12 【问题描述】:

我是 SQL Server 的新手。你能告诉我如何根据年、月、日、时间对这张表进行排序吗?这样我就可以以正确的日期升序显示其他列,例如“NAME”。

我正在使用以下 SQL 查询,但这会以 ascii 字符顺序返回结果:

SELECT * 
FROM table_name 
WHERE YEAR = '2016' 
ORDER BY YEAR, MONTH, DDATE, TIME

不按日期排序。能否请您举例说明如何实现这一目标。

我有一个如下所示的 SQL Server 表:

【问题讨论】:

您需要将年、月、日和时间组合成一个值,例如自纪元以来的儒略日期或分钟数,然后对其进行排序。这是一个计算器http://aa.usno.navy.mil/data/docs/JulianDate.php 月份部分把你搞砸了;三月应该是 3,四月应该是 4,等等。正如 Marichyasana 推断的那样,您可以创建一个由这些值串联组成的计算列,例如 20160330、20160304 等。 order by YEAR, MONTH(MONTH+' 1 2000'), DDATE, TIME 或从零件中创建一个 DateTime2 并按该***.com/questions/16298624/… 订购 【参考方案1】:

正如 B. Clay 建议的那样,月份可能没有按照您的想法进行,因为它看起来像是一个 varchar 或类似的,它只是按字母顺序排列。

试试这样的:

SELECT * FROM table_name 
where YEAR = '2016' order by 
YEAR, DATEPART(MM,MONTH + ' 1 2016'), DDATE, TIME

小提琴:http://sqlfiddle.com/#!6/e345e/9

相关:Convert month name to month number in SQL Server

【讨论】:

感谢 Zoidz 和 zzbomb。将此代码与CONVERT(Int,DDATE), CONVERT(TIME, TIME) 结合后,它运行良好。谢谢你们给我举个例子【参考方案2】:

首先。尽可能只使用一列作为日期。

但在您的情况下,您的列是 VARCHAR 类型。试试这样的。

SELECT * FROM table_name where YEAR = '2016' 
order by 
   CONVERT(Int,YEAR), 
   (CASE MONTH
        WHEN 'January' THEN 1
        WHEN 'February' THEN 2
        WHEN 'March' THEN 3
        WHEN 'April' THEN 4
        WHEN 'May' THEN 5
        WHEN 'June' THEN 6
        WHEN 'July' THEN 7
        WHEN 'August' THEN 8
        WHEN 'September' THEN 9
        WHEN 'October' THEN 10
        WHEN 'November' THEN 11
        WHEN 'December' THEN 12), 
  CONVERT(Int,DDATE), 
  CONVERT(TIME, TIME)

【讨论】:

以上是关于如何根据日期对SQL Server中的多个列进行排序的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server:根据列中的日期返回最近的记录

根据 SQL Server 2008 R2 中特定列中的模式更改对行进行分组

SQL Server,HQL:如何将 SQL Server 日期时间列字段与日期进行比较

根据 SQL Server 中的条件计数

如何在 SQL Server 中按日期列排序的组中对列进行排名

SQL多表联合查询按日期排序