T10=] 连接字符串并将其转换为日期时间

T-SQL concatenate & convert string to date time

我有一个 table(再次由生物识别软件实现),它将日期和时间作为字符串存储在不同的列中。

日期列存储日期,例如 20160128 for January 18 2016,时间列存储时间,例如 220747 (10:07:47 PM).

如何连接两个字符串并转换为有效的日期时间值?

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

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

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

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

如果您的 date/time 字符串存储在 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 的帮助页面,看看最适合您的需求:https://msdn.microsoft.com/en-us/library/ms187928.aspx

SELECT Convert(datetime, '20160128' + ' ' +  '22:07:47', 113)

似乎有效,所以我建议您简单地连接日期,并根据需要 丰富 时间部分(使用 SubString(),注意添加当小时部分只有 1 个数字时,起始为零)

如果您可以将字符串转换为 SQL 服务器可以本地解析的格式,您就可以直接转换它 - 例如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))