【问题标题】:SQL converting NTEXT -> VARCHAR -> FLOAT and doing a differenceSQL 转换 NTEXT -> VARCHAR -> FLOAT 并有所作为
【发布时间】:2017-07-26 14:36:50
【问题描述】:

我有两个字段,一个是 int,一个是 ntext。我需要从 int 字段中减去 ntext 字段。我将 Hours_Current 这是 int 字段除以 60。我已经调试了一段时间,可以确认第一个 CAST 正在工作并按预期除以 60。然后我将 nText 字段转换为浮动并从小时中减去时间。数据库中的时间字段有一些条目是数字(我需要),一些条目是文本(不需要)。

SELECT
CAST(SUM(Hours_Current) AS FLOAT)/60 AS 'Current Hours'
CONVERT(FLOAT, CONVERT(VARCHAR(MAX), ObjField)) AS 'Time',
'Time' - 'Current Hours' AS DIFF

我已经尝试了无数种不同的方法来实现这一点。大多数时候我得到“操作数数据类型 varchar 对减法运算符无效”。我的最终目标是在报告中使用它。我还取出了 DIFF 并使用 SSRS 表达式尝试减去这两个字段,并在报告中得到 #Error。

我已经看到this 链接并尝试过,但它似乎不起作用。我在网上看了又看,我发现有几篇文章想谈谈ntext是如何贬值的。不幸的是,我无法更改数据库架构。有什么想法吗?

我也尝试过使用 nvarchar 代替 varchar。

【问题讨论】:

  • 你可以给我们一些样本数据来处理

标签: sql sql-server reporting-services diff ntext


【解决方案1】:

您不能在同一个 select 子句中使用 select 子句中的别名。 您必须进行两次计算或使用 cte/派生表:

;WITH CTE AS
(
SELECT
CAST(SUM(Hours_Current) AS FLOAT)/60 AS Current_Hours
CONVERT(FLOAT, CONVERT(VARCHAR(MAX), ObjField)) AS [Time]
FROM ...
WHERE ...
)

SELECT Current_Hours As [Current Hours], 
       [Time], 
       [Time] - Current_Hours As [Diff]
FROM CTE

SELECT
CAST(SUM(Hours_Current) AS FLOAT)/60 AS [Current Hours]
CONVERT(FLOAT, CONVERT(VARCHAR(MAX), ObjField)) AS [Time],
     (CAST(SUM(Hours_Current) AS FLOAT)/60) - 
     (CONVERT(FLOAT, CONVERT(VARCHAR(MAX), ObjField))) As [Diff]
FROM ...

【讨论】:

  • 感谢您快速而出色的回复。我使用了第二种解决方案,它就像一个魅力。我不确定你做的和我做的有什么不同,因为我觉得我已经尝试过了,但我会弄清楚哪里出了问题。非常感谢!
猜你喜欢
  • 2022-01-19
  • 2015-11-05
  • 2013-06-11
  • 2013-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-03
  • 1970-01-01
相关资源
最近更新 更多