Sql server T-SQL级联&;将字符串转换为日期时间

Sql server T-SQL级联&;将字符串转换为日期时间,sql-server,datetime,concat,Sql Server,Datetime,Concat,我有一个表(同样由bio metric软件实现),它将日期和时间作为字符串存储在不同的列中 日期列存储2016年1月18日的日期,如20160128,时间列存储时间,如220747(10:07:47 PM) 如何连接这两个字符串并转换为有效的datetime值 我已经提到了这里提出的其他几个问题,发现其中许多问题只涉及日期部分,缺少时间因素 下面是一个示例脚本,它从存储在VARCHAR列中的日期和时间进行转换。如果格式化为YYYYMMDD[hh:mm:ss[.mmm]](ISO 8601格式),

我有一个表(同样由bio metric软件实现),它将日期和时间作为字符串存储在不同的列中

日期列存储2016年1月18日的日期,如
20160128
,时间列存储时间,如
220747
10:07:47 PM

如何连接这两个字符串并转换为有效的datetime值

我已经提到了这里提出的其他几个问题,发现其中许多问题只涉及日期部分,缺少时间因素


下面是一个示例脚本,它从存储在
VARCHAR
列中的日期和时间进行转换。如果格式化为
YYYYMMDD[hh:mm:ss[.mmm]]
(ISO 8601格式),则可以将其转换为:


如果您的日期/时间字符串存储在
CHAR
列中,则由于字符串中填充了空格,因此更为复杂。这需要使用
RTRIM
修剪空间:

DECLARE @dtpart CHAR(16) = '20160128';
DECLARE @timepart CHAR(16) = '20747';

SELECT CAST(RTRIM(@dtpart) + ' ' + LEFT(RTRIM(@timepart),LEN(RTRIM(@timepart))-4)+ ':' + SUBSTRING(RTRIM(@timepart),LEN(RTRIM(@timepart))-3,2) + ':'+RIGHT(RTRIM(@timepart),2) AS DATETIME)

您应该查看
Convert
的帮助页面,看看什么最适合您的需要:


似乎有效,因此我建议您只需按原样连接日期并根据需要丰富时间部分(使用
SubString()
,注意在小时部分只有1个数字时添加起始零)

如果可以将字符串转换为SQL server本机可以解析的格式,然后,您可以直接对其进行强制转换-例如yyyyMMdd hh:mm:ss格式:

declare @date char(8)
set @date = '20160128'

declare @time char(6)
set @time = '220747'


select cast(@date + ' ' + substring(@time, 1, 2) + ':' + substring(@time, 3, 2) + ':' + substring(@time, 5, 2) as datetime)
试试这个

declare @val varchar(10) = '20160128'
declare @va2 varchar(10) = '220747'

select convert(datetime,cast(convert(date, @val, 121) as varchar(10)) +' '+substring(cast(@va2 as varchar (6)), 1, 2)+':'+substring(cast(@va2 as varchar(6)), 3, 2)+':'+substring(cast(@va2 as varchar(6)), 5, 2))  as Date
试试这个:-

DECLARE @dtpart VARCHAR(16) = '20160128';
DECLARE @timepart VARCHAR(16) = '220747';

DECLARE @t DateTIME  
SET @t = LEFT(@timepart,LEN(@timepart)-4)+':'+SUBSTRING(@timepart,LEN(@timepart)-3,2)+':'+RIGHT(@timepart,2) 

select LEFT(convert(varchar(50),Convert(datetime, @dtpart ,100)),11)+' '+ LTRIM(RIGHT(CONVERT(CHAR(20), @t, 22), 11)) 

这些列的数据类型是什么?正如我在文章中提到的,这些值存储为字符串。这两列都被定义为CHAR您的意思是
CHAR(XXX)
,或者
VARCHAR(XXX)
?您的答案看起来最可行,但是正如我在问题中提到的,时间字符串是220747,为了将您的建议带到工作解决方案中,我必须进行额外的字符串操作,将其格式化为22:07:47。使用Oracle要简单得多…我认为问题不在于RDBMS,而在于将日期时间存储为字符串=)的应用程序。它不仅效率低下(占用更多空间),而且使处理值变得更加困难(例如,尝试计算两条记录之间的时间差)也许Oracle有一个支持这种格式的隐式转换,但即使这样,它仍然是一个值得怀疑的设计选择,因为它仍然需要反复转换为“本机”日期时间数据类型,无论何时您想要对其进行操作。我接受您的建议作为答案,因为我没有其他可以立即看到的解决方案满足我的要求。非常感谢。
declare @val varchar(10) = '20160128'
declare @va2 varchar(10) = '220747'

select convert(datetime,cast(convert(date, @val, 121) as varchar(10)) +' '+substring(cast(@va2 as varchar (6)), 1, 2)+':'+substring(cast(@va2 as varchar(6)), 3, 2)+':'+substring(cast(@va2 as varchar(6)), 5, 2))  as Date
DECLARE @dtpart VARCHAR(16) = '20160128';
DECLARE @timepart VARCHAR(16) = '220747';

DECLARE @t DateTIME  
SET @t = LEFT(@timepart,LEN(@timepart)-4)+':'+SUBSTRING(@timepart,LEN(@timepart)-3,2)+':'+RIGHT(@timepart,2) 

select LEFT(convert(varchar(50),Convert(datetime, @dtpart ,100)),11)+' '+ LTRIM(RIGHT(CONVERT(CHAR(20), @t, 22), 11))