2016-12-31 132 views
0

我想在我的SQL中查看前3个月的会话小时数(hrs列声明为nvarchar),如果我想查看数据,则需要将数据转换为浮点数最近3个月,但我得到了一些错误将nvarchar转换为在SQL Server中浮动时出错

SELECT sum(convert(float, hrs)) 
FROM companysonvinunitvenue 
WHERE date >= DATEADD(day, -90, GETDATE()) 

错误:

Msg 8114, Level 16, State 5, Line 1
Error converting data type nvarchar to float.

SELECT sum(cast(hrs as float)) 
FROM companysonvinunitvenue 
WHERE date >= DATEADD(day, -90, GETDATE()) 

错误:

Msg 8114, Level 16, State 5, Line 1
Error converting data type nvarchar to float.

SELECT CAST(CAST (hrs AS NUMERIC(19,4)) AS INT) 
FROM companysonvinunitvenue 
WHERE date >= DATEADD(day, -90, GETDATE()) 

错误:

Msg 8114, Level 16, State 5, Line 1
Error converting data type nvarchar to numeric.

SELECT CAST(CAST (hrs AS int) AS INT) 
FROM companysonvinunitvenue 
WHERE date >= DATEADD(day, -90, GETDATE()) 

错误:

Msg 245, Level 16, State 1, Line 1
Conversion failed when converting the nvarchar value '02:00:00 ' to data type int.

我想这四种方式,并在所有的人都失败了,我需要怎么做呢?

+0

如果'hrs'表示** **时间 - 那么为什么地球上被它定义为'nvarchar'?修正你的有缺陷的设计 - 如果它**是一个数值,那么它**也需要被存储**。我会避免因其不精确性而使用“float”,而使用“decimal(p,s)” –

回答

1

首先,对日期时间值使用date and time data types。你会避免这些和其他许多麻烦,并且还可以节省磁盘空间,RAM,减少读取次数等等。

至于你的问题。对于SQL Server 2008+

DECLARE @companysonvinunitvenue TABLE (hrs NVARCHAR(10)) 

INSERT @companysonvinunitvenue VALUES ('02:00:00'),('21:31:03') 

SELECT DATEPART(HOUR,CAST(hrs AS time)) 
FROM @companysonvinunitvenue 

对于其他版本

DECLARE @companysonvinunitvenue TABLE (hrs NVARCHAR(10)) 

INSERT @companysonvinunitvenue VALUES ('02:00:00'),('21:31:03') 

SELECT cast(LEFT(hrs,2) AS INT) 
FROM @companysonvinunitvenue 
相关问题