【发布时间】: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) 数据类型强制使用适当的格式化字符串和长度。这样可以避免一些不良数据——不是所有的都介意你——而是大多数。
标签: sql sql-server