SQL Server中如何将特定形式字符串转换为时间格式。并将该时间进行加减
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL Server中如何将特定形式字符串转换为时间格式。并将该时间进行加减相关的知识,希望对你有一定的参考价值。
需求为:字段在数据库中为"0548"类似这样的字符型数据,"0548"表示5:48如何将该字段转化为date型数据
如果字符都是4位的话,像下面这样就可以了,select cast(left('0548',2)+':'+right('0548',2) as time)
这样就能转成时间格式了,如果转成日期+时间的话
select cast(left('0548',2)+':'+right('0548',2) as datetime)
不过年份是从1900年,年份你可以用dateadd函数再调整 参考技术A 写一个标量值函数 对字符串进行处理后返回一个datetime型的数据啊追问
现在的情况是只能在sql里面写。。
追答先创建一个函数
CREATE FUNCTION getMyDate
(
-- Add the parameters for the function here
@timeStr nvarchar(20)
)
RETURNS datetime
AS
BEGIN
-- Declare the return variable here
DECLARE @ret datetime
-- Add the T-SQL statements to compute the return value here
--这里加转换公式,可以用下面兄弟给出的
set @ret=cast('.....' as datetime)
-- Return the result of the function
RETURN @ret
END
后面直接调用
dbo.getMyDate('0405')
如何在 SQL Server 中将 varchar 数据转换为时间
【中文标题】如何在 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中如何将特定形式字符串转换为时间格式。并将该时间进行加减的主要内容,如果未能解决你的问题,请参考以下文章
如何在 SQL Server 中将 varchar 数据转换为时间
在 SQL Server 2008 R2 中将 varchar 转换为时间戳