有些机构可以告诉我以下代码有什么问题。我正在努力争取时间,但它无法正常工作。
declare @LssiTime nvarchar(30)
declare @NewLssiTime varchar(5)
set @LssiTime = '2015-03-18 11:45:47.390'
SELECT @NewLssiTime = CONVERT(varchar(5), @LssiTime,108)
select @NewLssiTime
答案 0 :(得分:3)
这不起作用的原因是因为@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数据类型转换为日期时间数据类型会导致超出范围的值。
在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;
答案 1 :(得分:1)
试试这个:SELECT @NewLssiTime = cast(@LssiTime as time)
它适合你的场景。
另外,在阅读了另一个答案之后,它之所以不起作用的原因是因为sql server将@LssiTime
视为varchar而不是datetime
。
在这种情况下,您将需要这样做:
Set @NewLssiTime = CONVERT(char(5),Convert(datetime,@LssiTime) ,108)