如何在 SQL Server 中对时间进行排序?

Posted

技术标签:

【中文标题】如何在 SQL Server 中对时间进行排序?【英文标题】:How to sort hours in SQL Server? 【发布时间】:2017-04-26 11:40:07 【问题描述】:

我有一张名为Transaction 的表。在那里找到了 Time 数据类型为 TimeStamp 的列。

所以数据看起来像2015-01-17 08:12:48.000

我想显示为8 am

例如

`2015-01-17 08:12:48.000`  `8 AM`
`2015-01-17 14:12:48.000`  `2 PM`

现在我得到了上面的结果。这是我的结果

Hour
----
01 PM
02 PM
04 PM
05 PM
06 PM
07 AM
07 PM
08 AM
09 AM
10 AM
11 AM
12 PM

这是对上述结果的查询。

SELECT
    FORMAT(CAST(Time as datetime),'hh tt') hour,
    COUNT(TransactionNumber) Total_Transaction,
    SUM(Total) salesCost
FROM 
    [HQMatajer].[dbo].[Transaction]
WHERE 
    StoreID = '1001' 
    AND YEAR(Time) = '2015' 
    AND MONTH(Time) = '01' 
    AND DAY(Time) = '15'
GROUP BY
    FORMAT(CAST(Time as datetime),'hh tt')`

现在我想对时间进行排序。它应该显示为

07 AM
08 AM
09 AM
10 AM
11 AM
12 PM
01 PM
02 PM
.
.
07 PM

谢谢

【问题讨论】:

SQL Server 中的timestamp 数据类型与日期和时间完全无关 - 它是一个简单的、基于服务器的二进制计数器 ..... 希望你的意思是datetime,而不是timestamp;如果您使用的是timestamp,则该值没有意义(注意:技术上timestamp 已过时 - 它现在是rowversion 的别名 - 该类型已重命名以避免这种混淆) 【参考方案1】:

简单地使用DATEPART函数

   Select DATEPART(HH, YOUR_DATETIME_COL) AS HR, ......
   ........  --Write your Statements
    ........
   ORDER BY HR

DATEPART 将给出整数格式的结果。所以 Order by 会给出准确的顺序

【讨论】:

【参考方案2】:

尝试将其添加到语句的末尾:

, convert(varchar(2), [time], 8)
order by convert(varchar(2), [time], 8)

导致:

SELECT
    FORMAT(CAST(Time as datetime),'hh tt') hour,
    COUNT(TransactionNumber) Total_Transaction,
    SUM(Total) salesCost
FROM 
    [HQMatajer].[dbo].[Transaction]
WHERE 
    StoreID = '1001' 
    AND YEAR(Time) = '2015' 
    AND MONTH(Time) = '01' 
    AND DAY(Time) = '15'
GROUP BY
    FORMAT(CAST(Time as datetime),'hh tt')
    , convert(varchar(2), [time], 8)
order by convert(varchar(2), [time], 8)

convert(varchar(2),[time],8) 以以下格式返回具有样式8 的日期时间:hh:mi:ss,并使用varchar(2) 将其截断为hh

convert and styles 的文档。

正如 Shakeer Mirza 所发布的,使用 datepart() 也可以。

datepart 的文档。

【讨论】:

我用解释更新了我的答案。希望有帮助!

以上是关于如何在 SQL Server 中对时间进行排序?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SQL Server 2005 中对 sql 表进行尴尬的旋转?

如何在 SQL 查询中对 LEFT JOIN 的顺序进行排序?

在 SQL Server 2008 R2 中对多行进行分组

如何在 SQL Server 中对 Bit 数据类型进行 PIVOT?

如何在SQL中对父记录中的记录进行排序

在 SQL 中对日期的字符串值进行排序