如何在 SQL Server 中将 varchar 数据转换为时间
Posted
技术标签:
【中文标题】如何在 SQL Server 中将 varchar 数据转换为时间【英文标题】:How to convert varchar data to time in SQL Server 【发布时间】:2022-01-21 02:38:58 【问题描述】:我有一个表,它的日期列为 date
类型,timein
和 timeout
类型为 varchar(max)
。
我正在尝试计算 timein
和 timeout
之间的总小时数,但我不能,因为我不知道如何将 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_CONVERT
或TRY_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 转换为时间戳