T-SQL连接&将字符串转换为日期时间

时间:2016-01-28 09:20:55

标签: sql-server datetime concat

我有一张表(再次由生物测量软件实现),它将日期和时间存储为不同列中的字​​符串。

日期列为20160128存储January 18 2016之类的日期,时间列存储时间22074710:07:47 PM)。

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

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

Table structure

5 个答案:

答案 0 :(得分:2)

以下是从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)

如果你的日期/时间字符串存储在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)

答案 1 :(得分:2)

您应查看Convert的帮助页面,了解最适合您需求的内容:https://msdn.microsoft.com/en-us/library/ms187928.aspx

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

似乎有效,所以我建议你简单地按日期连接日期,然后根据需要充实时间部分(使用SubString(),注意在时间点上添加一个起始零点小时部分只有1个数字)

答案 2 :(得分: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)

答案 3 :(得分:1)

试试这个..

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

答案 4 :(得分:1)

试试这个: -

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))