Yog*_*ogi 0 sql-server t-sql type-conversion
我有一个 varchar 列有像 (2015-12-02 20:40:37.8130000) 这样的数据,我已经从 csv 文件导入到 SQL 表。我需要将此列转换为数据时间 (2013-03-17 14:15:49.687)。
ALTER TABLE track_date alter column start_time datetime.
Run Code Online (Sandbox Code Playgroud)
得到错误为:
从字符串转换日期和/或时间时,消息 241,级别 16,状态 1,第 1 行转换失败。
使用 convert 函数进行转换时,得到相同的错误:
SELECT convert(datetime,start_time,5) from track_date
Run Code Online (Sandbox Code Playgroud)
从字符串转换日期和/或时间时,消息 241,级别 16,状态 1,第 1 行转换失败。
你能帮忙吗,如何将此 varchar 数据转换为日期时间格式?
varchar 中的精度太高,无法转换为日期时间。
一种选择(在我看来更好)是将目标列更改为 datetime2(7)。然后你可以像这样转换:
declare @dt varchar(50)
set @dt = '2015-12-02 20:40:37.8130000'
select cast(@dt as datetime2(7));
Run Code Online (Sandbox Code Playgroud)
如果更改列不是一个选项,您可以像这样进行转换:
declare @dt varchar(50)
set @dt = '2015-12-02 20:40:37.8130000'
select cast(cast(@dt as datetime2(7))as datetime)
Run Code Online (Sandbox Code Playgroud)
DATETIME 只允许三位毫秒精度。您需要修剪前三毫秒之后的尾随位置,或者如果您使用的是任何版本的 SQL Server 2008 或更高版本,则可以使用 DATETIME2。
DATETIME2 允许最多七位毫秒精度,并且可以为您的表或查询显式设置精度级别。可以在datetime2 (Transact-SQL) 中找到更多详细信息和差异。
您可以通过执行以下 CAST 查询来验证:
SELECT CAST('2015-12-02 20:40:37.8130000' AS DATETIME2)
Run Code Online (Sandbox Code Playgroud)