我是B级SQL用户,请耐心等待。我有一个NVARCHAR格式的字段(“年”),但1000个记录中只有大约1个字段不是数字。是的,这是一种荒谬的方式,但我们从客户那里收到这个数据库,我们无法改变它。 我想从数据库中提取年份字段大于某些内容(例如,2006或更高版本)的记录。我可以忽略那些年份没有评估到实际年份的记录。我们正在使用SQL Server 2014。 我创建了一个嵌入式查询来将数据转换为“float”字段,但无论出于何种原因,我都无法使用这个新的浮点字段添加where子句。我最初尝试使用“case-if”但我得到了相同的结果。 我正在把头发拉出来,因为我要么缺少一些非常愚蠢的东西,要么SQL服务器中有一个错误。当我看到小提示中的字段时,它显示为浮动。当我运行它时,我得到“将数据类型nvarchar转换为浮动时出错。”
SELECT VL.Field_A,
VL.FLYear,
VL.Field_B
FROM
(select
Field_A,
cast ([Year] as float) as FLYear,
/* didn't work either*/
/*Convert(float, [Year]) as FLYear, */
Field_B
from CustomerProvidedDatabaseTable
where (Field_A like 'E-%' OR
Field_A like 'F-%')
and
(isnumeric(year)=1)
and
year is not null
) VL
/* this statement is the one it chokes on */
where
VL.FLYear >= 2006.0
如果我删除最后一个“where”子句,它工作正常,该字段看起来像一个数字。如果我将最后一个where子句更改为:
where VL.FLYear like '%2006%'
SQL Server接受它,但它当然不会返回我想要的所有记录。
答案 0 :(得分:0)
尝试简化它并只使用TRY_CONVERT(DATETIME,aYearvalue)或TRY_PARSE,它将为它无法转换并继续处理有效行的值返回NULL。我认为你可以将where子句作为连接取消,并直接对列进行操作,如:(在日期时间后用字符替换文字字符串)
SET DATEFORMAT mdy;
选择年份(try_convert(datetime,' 08/01 / 2017'))作为value1 WHERE value1> = 2016;
答案 1 :(得分:0)
尝试转换/转换为数字数据类型。我已经修改了查询的最后一行来做到这一点。看一眼。
SELECT
VL.Field_A,
VL.FLYear,
VL.Field_B
FROM
(select
Field_A,
cast ([Year] as float) as FLYear,
/* didn't work either*/
/*Convert(float, [Year]) as FLYear, */
Field_B
from CustomerProvidedDatabaseTable
where (Field_A like 'E-%' OR
Field_A like 'F-%')
and
(isnumeric(year)=1)
and
year is not null
) VL
/* this statement is the one it chokes on */
where
ISNUMERIC(VL.FLYear) = 1
and
CAST(VL.FLYear AS INT) >= 2006
查看以下链接以获取演员和转换文档: https://docs.microsoft.com/en-us/sql/t-sql/functions/cast-and-convert-transact-sql
注意:ISNUMERIC将返回true(具有科学数值的值的误报,例如1E10,但我不会从您的数据中看到这种情况)。
另一个选项是TRY_CONVERT。
关于TRY_CONVERT的文档:https://docs.microsoft.com/en-us/sql/t-sql/functions/try-convert-transact-sql
答案 2 :(得分:-3)
尝试使用投射。使用以下链接查看有关投射的更多细节。
https://docs.microsoft.com/en-us/sql/t-sql/functions/cast-and-convert-transact-sql