这不起作用的原因是因为@LssiTime 是一个varchar,因此样式108 什么都不做。另一个例子是:
SELECT CONVERT(VARCHAR(5), 'CONVERSTION TEST', 108);
-------
CONVE
仅仅因为您将'2015-03-18 11:45:47.390' 读取为日期,并不能改变您告诉SQL Server 它是nvarchar(30) 的事实。
好消息是,SQL Server 已经准备好在没有nvarchar 或varchar 的情况下处理日期和时间,有许多date and time formats and functions,这意味着您不需要依赖字符串转换。
这给我带来了您的字符串格式的另一个问题。如果你跑了:
SET DATEFORMAT MDY;
DECLARE @Date DATETIME = '2015-03-18 11:45:47.390';
SELECT CAST(@Date AS TIME(0));
你得到11:45:47 的结果。如果您要使用不同的区域设置运行它:
SET DATEFORMAT DMY;
DECLARE @Date DATETIME = '2015-03-18 11:45:47.390';
SELECT CAST(@Date AS TIME(0));
你得到一个错误:
将 varchar 数据类型转换为 datetime 数据类型导致值超出范围。
在 SQL Server 中处理DATETIME 和SMALLDATETIME 时,唯一 文化不变格式是yyyyMMdd,因此您可以使用任何设置运行以下命令而不会出现错误:
DECLARE @Date DATETIME = '20150318 11:45:47.390';
SELECT CAST(@Date AS TIME(0));
如果你坚持使用字符串,那么至少我们是一个合适的字符串,一个有效的日期时间不会包含 unicode 字符,所以你也可以使用varchar,就像上面一样,转换为时间会隐式地将您的字符串转换为日期,因此您仍然可以使用:
DECLARE @Date VARCHAR(30) = '20150318 11:45:47.390'
SELECT CAST(@Date AS TIME(0));
如果您希望您的时间为 varchar(5),您仍必须在转换为 varchar 之前转换为时间或日期时间:
DECLARE @Date VARCHAR(30) = '20150318 11:45:47.390'
DECLARE @Time VARCHAR(5) = CAST(CAST(@Date AS TIME(0)) AS VARCHAR(5));
SELECT @Time;