CAST(DATEPART(hh, timestamp) AS varchar(2)) + ':00' AS Hour
这会让我从时间戳字段中获取时间,但是在小时0-9的情况下,它不会填充前导零,因此当我按小时降序排序时,它不能正确排序。
不确定这里有什么问题。我指定一个2 char varchar以允许前导零的额外空间。希望有一种方法可以解决这个问题,而不会通过一个能为我填充前导零的函数传递我的字段。
答案 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