从sql server中的datetime获取时间

时间:2015-03-18 16:06:08

标签: sql

有些机构可以告诉我以下代码有什么问题。我正在努力争取时间,但它无法正常工作。

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

2 个答案:

答案 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已经准备好处理没有nvarcharvarchar的日期和时间,有一些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中处理DATETIMESMALLDATETIME时,文化不变格式是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)