如何在 SQL Server 中将 varchar 数据转换为时间

Posted

技术标签:

【中文标题】如何在 SQL Server 中将 varchar 数据转换为时间【英文标题】:How to convert varchar data to time in SQL Server 【发布时间】:2022-01-21 02:38:58 【问题描述】:

我有一个表,它的日期列为 date 类型,timeintimeout 类型为 varchar(max)

我正在尝试计算 timeintimeout 之间的总小时数,但我不能,因为我不知道如何将 varchar 转换为 time 格式。

到目前为止,我已经尝试过 CAST(x, AS time)CONVERT(time, x, 114)(也是 108 个),但我不断收到错误

从字符串转换日期和/或时间时转换失败

提前感谢您提供的任何帮助。

我的餐桌日期如下所示:

EmpID Date TimeIn TimeOut
123456 2021-12-13 05:55 14:30

预期结果:

EmpID Date TimeIn TimeOut Total_hrs
123456 2021-12-13 05:55 14:30 8:35

【问题讨论】:

显然 一些 行没有正确转换。以下是什么返回 SELECT * FROM YourTable WHERE TRY_CAST(TimeIn AS time) IS NULL OR TRY_CAST(TimeOut AS time) IS NULL 请记住,您在某些行上有 WHERE 过滤并不意味着强制转换将在过滤之后完成,它可能在之前完成 select convert(time,'14:30',114) t1, convert(time,'05:55',108) t2 运行正常 @charlieface 非常感谢.. 我假设这些列只包含时间,有一条记录包含文本值,其中包含错误。极端的菜鸟错误。 @Veebster - 如果您的列定义正确,这不会是一个问题。与其将它们定义为 varchar(max),不如将它们定义为具有适当精度的时间。如果那是不可能的(由于某些非常糟糕的原因)-那么至少使用检查约束和 char(5) 数据类型强制使用适当的格式化字符串和长度。这样可以避免一些不良数据——不是所有的都介意你——而是大多数。 【参考方案1】:

为避免转换错误时间字符串时出错,您可以使用TRY_CONVERTTRY_CAST。 当他们无法转换/转换它时,他们只会返回 NULL。

例如

create table yourtable (
 EmpID int, 
 [Date] date, 
 TimeIn varchar(5),
 TimeOut varchar(5)
);

insert into yourtable (EmpID, [Date], TimeIn, TimeOut) values
(123456, '2021-12-14', '05:55', '14:30'),
(234567, '2020-12-13', 'not.a', 'time!');


select *
, [Total_hrs] = convert(char(5),dateadd(minute, datediff(minute, try_cast(TimeIn as time), try_cast(TimeOut as time)), 0), 108)
from yourtable
EmpID Date TimeIn TimeOut Total_hrs
123456 2021-12-14 05:55 14:30 08:35
234567 2020-12-13 not.a time! null

db小提琴here

【讨论】:

【参考方案2】:

这可能会以您想要的方式给出您的响应。我只是创建我的数据来测试我的方法,你可以通过在查询中替换你的表名来摆脱它们:

with t(EmpID, Date, TimeIn, TimeOut) as(

     select 123456 as EmpID, cast('2021-12-13' as date) as Date, '05:55' as TimeIn, '14:30' as TimeOut      
)
select rt.*, cast(minn/60 as varchar(10)) + ':' + cast(minn%60 as varchar(10)) as Total_hrs
from (
    select c.*, DATEDIFF(MINUTE, convert(time,TimeIn,108), convert(time,TimeOut,114)) minn from t c
)rt

【讨论】:

以上是关于如何在 SQL Server 中将 varchar 数据转换为时间的主要内容,如果未能解决你的问题,请参考以下文章

在没有科学计数法的 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 中将字符串转换为日期时间?