sql cast of hour of datetime而不会在单个数字小时内丢弃前导零

时间:2012-02-16 15:06:06

标签: sql sql-server tsql sql-server-2008-r2

CAST(DATEPART(hh, timestamp) AS varchar(2)) + ':00' AS Hour

这会让我从时间戳字段中获取时间,但是在小时0-9的情况下,它不会填充前导零,因此当我按小时降序排序时,它不能正确排序。

不确定这里有什么问题。我指定一个2 char varchar以允许前导零的额外空间。希望有一种方法可以解决这个问题,而不会通过一个能为我填充前导零的函数传递我的字段。

3 个答案:

答案 0 :(得分:16)

SELECT RIGHT('0' + CONVERT(VARCHAR(2), DATEPART(HOUR, GETDATE())), 2) + ':00';

不想用0填充?好吧,你可以用一种同样丑陋的方式做到这一点而不会出现填充问题:

SELECT LEFT(CONVERT(TIME(0), GETDATE()), 2) + ':00';

显然用您的列名替换GETDATE()。我希望不是真的timestamp,因为这是一个保留字 - 对于与日期或时间无关的数据类型,遗憾的是。

如果您不喜欢这些解决方案中的任何一个,那么只需从SQL Server中选择数据并让您的客户端应用程序处理格式/演示文稿详细信息。当然,使用C#的format()函数很容易做到这一点。

答案 1 :(得分:3)

假设时间戳是表格中的一列

select convert(char(3), timestamp, 108) + '00' AS Hour 
from yourtable

替代

select left(cast(dateadd(hh, datediff(hh, 0, timestamp), 0) as time), 5)
from yourtable

编辑:

经过测试后,我得出的结论是,这是最快的方式(几乎是Aaron解决方案的性能和语法)

SELECT RIGHT(100 + DATEPART(HOUR, timestamp) , 2) + ':00'
from yourtable

答案 2 :(得分:2)

您可以使用默认情况下24小时的TIME类型;

cast(cast(timestamp as time) AS varchar(2)) + ':00' AS Hour