当时间格式不同时,日期时间为 NULL

Datetime is NULL when time format differs

我有特定的时间场景,可以是 4 位数字、6 位数字,也可以是 NULL 或字符串,如下所述。在场景 3 和场景 4 中,我计算日期时间的方法不起作用并且为 NULL 对于案例 3 和案例 4,有什么方法可以获取 00:00:00:000 的日期吗? & 对于 1,它应该是 10:02:00:000

DECLARE @DATE VARCHAR(10) =CAST(GETDATE() AS DATE)
DECLARE @Time1 VARCHAR(10) = '1002'
DECLARE @Time2 VARCHAR(10) = '160634'
DECLARE @Time3 VARCHAR(10) = '0900XX'
DECLARE @Time4 VARCHAR(10) = ''


SELECT TRY_CONVERT(DATETIME, @DATE +' '
                                  +LEFT(ltrim(@Time1), 2) 
                                  + ':' + SUBSTRING(@Time1, 3, 2)
                                            + ':' + RIGHT(rtrim(@Time1), 2)) , TRY_CONVERT(TIME, @Time1), @Time1 AS Time

SELECT TRY_CONVERT(DATETIME, @DATE +' '
                                  +LEFT(ltrim(@Time2), 2) 
                                  + ':' + SUBSTRING(@Time2, 3, 2)
                                            + ':' + RIGHT(rtrim(@Time2), 2)) , TRY_CONVERT(TIME, @Time2), @Time2 AS Time

SELECT TRY_CONVERT(DATETIME, @DATE +' '
                                  +LEFT(ltrim(@Time3), 2) 
                                  + ':' + SUBSTRING(@Time3, 3, 2)
                                            + ':' + RIGHT(rtrim(@Time3), 2)) , TRY_CONVERT(TIME, @Time3), @Time3 AS Time

SELECT TRY_CONVERT(DATETIME, @DATE +' '
                                  +LEFT(ltrim(@Time4), 2) 
                                  + ':' + SUBSTRING(@Time4, 3, 2)
                                            + ':' + RIGHT(rtrim(@Time4), 2)) , TRY_CONVERT(TIME, @Time4), @Time4 AS Time

..................
DECLARE @Time4 VARCHAR(10) = ''

select @Time1 = concat(cast(@Time1 as varchar(8)), replicate('0', 8));
select @Time2 = concat(cast(@Time2 as varchar(8)), replicate('0', 8));
select @Time3 = concat(cast(@Time3 as varchar(8)), replicate('0', 8));
select @Time4 = concat(cast(@Time4 as varchar(8)), replicate('0', 8));

SELECT TRY_CONVERT(DATETIME, @DATE +' '......................

我个人会将值“填充”为 6 位数字,注入 : 个字符,然后使用 TRY_CONVERT。然后你使用 ISNULL 到 return midmight 失败的转换:

SELECT ISNULL(TRY_CONVERT(time(0),STUFF(STUFF(RIGHT('000000' + V.VarcharTime,6),5,0,':'),3,0,':')),'00:00:00')
FROM (VALUES(@Time1),
            (@Time2),
            (@Time3),
            (@Time4))V(VarcharTime);

如果 100210:02:00 而不是 00:10:02 则在右侧而不是左侧填充:

SELECT ISNULL(TRY_CONVERT(time(0),STUFF(STUFF(LEFT(V.VarcharTime+'000000',6),5,0,':'),3,0,':')),'00:00:00')
FROM (VALUES(@Time1),
            (@Time2),
            (@Time3),
            (@Time4))V(VarcharTime);