如何在 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 的顺序进行排序?