INT到hh:mm:ss在SQL Server中

时间:2011-01-10 01:22:52

标签: sql-server

我将从datediff()

计算出一个整数

让我们说..它是......

declare @earliestTime int;
set @earliestTime=50000000;

我想转换为hh:mm:ss tt

我有这个代码将该int转换为HH:mm:ss

CONVERT(varchar(6), (@earliestTime)/60)+ ':' + RIGHT('0' + CONVERT(varchar(2), ((@earliestTime) % 60) ), 2)+ ':' + RIGHT('0' + CONVERT(varchar(2), ((@earliestTime) %60)*0), 2)

如何将其修改为hh:mm:ss tt(AM或PM)

我这样修改了..

CONVERT(varchar(6), 
case 
when 
((@earliestTime)/60)<=12 
then 
((@earliestTime)/60) 
else 
(((@earliestTime)/60)-12)
end )

--CONVERT(varchar(6), case when((@earliestTime)/60)<=12 then (@earliestTime)/60 else ((@earliestTime)/60)-12)
+ 
':' 
+ 
RIGHT('0' + CONVERT(varchar(2), ((@earliestTime) % 60) ), 2)
+ 
':' 
+ 
RIGHT('0' + CONVERT(varchar(2), ((@earliestTime) %60)*0), 2
+
' '
+
convert(varchar(2),(case when ((@earliestTime)/60)<12 then 'am' else 'pm' end)))

但它给了我这个错误..

  

转换时转换失败   varchar值'pm'到数据类型int。

我已经将'pm'或'am'转换为varchar(2)。为什么系统仍然给我这个错误?

如何使其正确或有更好的方法?

1 个答案:

答案 0 :(得分:2)

你没有解释你的整数代表什么,因此很难给出答案。

最好使用适当的数据类型。我使用DATETIME - 它将允许您根据需要执行计算,排序和格式化。将文字存储时间会导致后来的麻烦。

通过将时间添加到SQL纪元(1900-01-01 00:00:00)来存储时间,就像这样

SELECT DATEADD(SECOND, 50000, CONVERT(DATETIME, 0.0))
SELECT DATEADD(MINUTE, 50000, CONVERT(DATETIME, 0.0))

然后相应地格式化DATETIME对象。

  • 要获得HH:mm:ss,请使用格式108。
  • 要获取AM / PM标记,请使用100并取最右边的两个字符。

尝试以下方法:

DECLARE @date DATETIME
SET @date = DATEADD(SECOND, 50000, CONVERT(DATETIME, 0.0))
SELECT CONVERT(VARCHAR, DATEPART(HOUR, @date)%12) 
    + ':' + RIGHT(CONVERT(VARCHAR, @date, 108),5) 
    + RIGHT(CONVERT(VARCHAR, @date, 100), 2)

我还应该指出,您正在使用数据库,而不是表示层。不必担心在数据库中格式化日期和时间;它是关于数据存储和检索。大概这次你回到应用程序或网页上放到屏幕上,报告或其他什么 - 最佳做法是将数据保持为完整的DATETIME并让顶层格式化它。通过转换为VARCHAR,您只是删除信息并限制自己;没有好处,很多成本。