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 类型,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中如何将特定形式字符串转换为时间格式。并将该时间进行加减的主要内容,如果未能解决你的问题,请参考以下文章

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

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

js 中日期 转换成时间戳 例如2013-08-30 转换为时间戳

在 Spark 中将字符串字段转换为时间戳的更好方法

php怎么将指定日期转换为时间戳?

Redshift (SQL):尝试转换为时间戳