在 SQL Server 中将 varchar 'hh:mm:ss' 转换为 datetime hh:mm:ss

Posted

技术标签:

【中文标题】在 SQL Server 中将 varchar \'hh:mm:ss\' 转换为 datetime hh:mm:ss【英文标题】:Convert varchar 'hh:mm:ss' to datetime hh:mm:ss in SQL Server在 SQL Server 中将 varchar 'hh:mm:ss' 转换为 datetime hh:mm:ss 【发布时间】:2021-11-28 09:47:10 【问题描述】:

我尝试将我的数据库中存储为HH:MM:SSvarchar 变量转换为实际的datetime 格式HH:MM:SS。我确实得到了 HH:MM:SS 的值,但尝试还加上了 YYYY:MM:DD 的前缀以及预期的结果。

以下是我用来将此 varchar 值转换为 HH:MM:SS 的代码以及我得到的结果。

我试过的代码:

DECLARE @Duration Varchar(10)
SET @Duration = '00:01:23'

SELECT CONVERT(datetime, Duration, 8) AS duration

我得到的输出:

1900-01-01 00:01:23.000

预期输出:

00:01:23

请让我知道需要更改的内容。谢谢!

【问题讨论】:

预期是错误的。这不是一个日期时间,它只是一个时间。持续时间不是日期。这些也不是前缀 - datetimedatetime 等是 binary 类型,而不是字符串 看来你想要的是时间数据类型而不是日期时间数据类型 【参考方案1】:

如果你想要time,你为什么要转换成datetime?鉴于名称,您同时获得日期和时间也就不足为奇了。试试:

DECLARE @Duration char(8) = '00:01:23';
SELECT duration = CONVERT(time(0), @Duration);

结果:

duration
00:01:23
示例db<>fiddle

请记住,time(也不是任何日期/时间类型)不是表示持续时间或间隔。因为当您的持续时间或间隔超过 24 小时时会发生什么?

【讨论】:

SQL Server 还没有合适的区间类型有点……不寻常 @PanagiotisKanavos 是的,但公平地说,添加类型很难。 2008 年添加的类型并没有完美的记录,从那以后他们也没有尝试过。 感谢大家的及时帮助。我对此有点困惑,但是您的代码对我有所帮助。再次感谢!【参考方案2】:

您发布的是时间,而不是日期或日期时间。持续时间不是日期。日期类型是二进制的,它们没有前缀。

你可以直接定义时间:

Declare @Duration time ='00:01:23'

或者您可以将字符串转换为时间:

Declare @Duration varchar(10)
Set @Duration = '00:01:23'
Select cast(@Duration as time)  as duration

Declare @Duration varchar(10)
Set @Duration = '00:01:23'
Select convert(time, @Duration,8)  as duration

很遗憾这不是持续时间,而是一天中的某个时间。它只能存储00:0023:59:59.9999999 之间的值。

SQL Server 没有间隔/持续时间类型。


【讨论】:

感谢您的帮助!这些 cmets 帮助了我很多!【参考方案3】:
Declare @Duration Varchar(10) 
Set @Duration = '00:01:23'
select convert(time,@duration,8);

【讨论】:

感谢您的回答! :)

以上是关于在 SQL Server 中将 varchar 'hh:mm:ss' 转换为 datetime hh:mm:ss的主要内容,如果未能解决你的问题,请参考以下文章

在没有科学计数法的 SQL Server 中将 float 转换为 varchar

在 SQL Server 2008 中将数据从浮点类型的 Excel 导入 varchar

在 SQL Server 存储过程中将 varchar 转换为 int 时出错

在 SQL Server 2008 R2 中将 varchar 转换为时间戳

在 SQL Server 中将 varchar 'hh:mm:ss' 转换为 datetime hh:mm:ss

在 sql server 中将 varchar yyyy-mm-dd T hh:mm 转换为 datetime2