2017-03-06 5 views
0

J'ai deux champs, un qui est int et un qui est ntext. J'ai besoin de soustraire le champ ntext du champ int. Im prenant Hours_Current qui est le domaine int et le plongeant de 60. J'ai débogué cela pendant un moment et peut confirmer que le premier CAST fonctionne et diviser par 60 comme prévu. Ensuite, je convertis le champ nText en flottant et en soustrayant le temps des heures. Le champ Heure dans la base de données comporte des entrées qui sont des nombres (ce dont j'ai besoin) et certaines entrées sont du texte (n'ont pas besoin).Conversion SQL NTEXT -> VARCHAR -> FLOAT et faire une différence

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

J'ai essayé d'innombrables façons d'y parvenir. La majorité du temps, je reçois un "type de données Opérande varchar est invalide pour soustraire l'opérateur". Mon objectif final est d'utiliser ceci dans un rapport. J'ai également supprimé le format DIFF et utilisé l'expression SSRS pour tenter de soustraire les deux champs et obtenir une erreur #Error sur le rapport.

J'ai vu this lien et j'ai essayé mais cela ne semble pas fonctionner. J'ai regardé et regardé en ligne et les quelques articles que j'ai trouvés veulent parler de la façon dont ntext est déprécié. Je ne peux malheureusement pas changer le schéma DB. Des idées?

J'ai également essayé d'utiliser nvarchar au lieu de varchar.

+0

que diriez-vous nous donner quelques exemples de données pour travailler avec – GuidoG

Répondre

1

Vous ne pouvez pas utiliser les alias dans la clause select à l'intérieur de la même clause select. Vous devez soit faire le calcul deux fois ou utiliser une cte/table dérivée:

;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 

OU

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 ... 
+0

Merci pour votre réponse rapide et un excellent . J'ai utilisé la deuxième solution et cela a fonctionné comme un charme. Je ne suis pas sûr de ce que vous avez fait différemment de ce que j'ai fait depuis que j'ai l'impression d'avoir essayé, mais je vais comprendre ce qui n'a pas fonctionné. Merci beaucoup! –