我需要在SQL Server中将此字符串转换为datetime

时间:2019-01-04 13:25:45

标签: sql sql-server datetime sql-server-2012

字符串:

'01/04/2019 01:50:31.230000000'

预期结果:

01/04/2019 01:50:31.230

作为DATETIME

使用的查询:

SELECT CONVERT(DATETIME, '01/04/2019 01:50:31.230000000', 113)  

3 个答案:

答案 0 :(得分:3)

如果没有最后6个零,则可以转换103 format中的字符串。
因此,SUBSTRINGLEFT仅可用于保留23个字符。
然后将其转换为DATETIME。

但是该字符串可以很好地转换为DATETIME2。
由于DATETIME2更准确。
而且DATETIME2可以简单地强制转换或转换为DATETIME。

请注意,DATETIME未以某种格式存储在表中。
它的显示方式是一种设置。

但是,您可以FORMAT将DATETIME返回所需的specific format中的字符串。 (从SQL Server 2012开始)

示例片段:

select 
col as col_input_string,
CAST(CONVERT(datetime2, col, 103) AS datetime) as col_as_datetime,
FORMAT(CONVERT(datetime2, col, 103), 'dd/MM/yyyy HH:mm:ss.fff') as col_as_formatted_string
from (values 
 ('01/04/2019 01:50:31.230000000')
,('31/12/2018 13:33:44.123456789')
) q(col);

结果:

col_input_string                col_as_datetime             col_as_formatted_string
01/04/2019 01:50:31.230000000   2019-04-01 01:50:31.230     01/04/2019 01:50:31.230
31/12/2018 13:33:44.123456789   2018-12-31 13:33:44.123     31/12/2018 13:33:44.123

答案 1 :(得分:2)

您想要的代码是:

SELECT CONVERT(datetime,LEFT('01/04/2019 01:50:31.230000000',23),103);

您需要使用LEFT,因为datetime仅精确到1/300秒;因此,您需要削减无法使用的精度。

答案 2 :(得分:0)

尝试使用

declare @vardate varchar(50) = '01/04/2019 01:50:31.230000000'
declare @date datetime =convert(date, left(@vardate,23), 103)
declare @time time = convert(time, substring(@vardate,12,12), 14)

select DATEADD(DAY, DATEDIFF(DAY, @time, @date), CAST(@time AS DATETIME)) AS Result

如果这样不起作用,请检查其他转换格式。