2010-07-11 22 views
5

Desidero che questa funzione prenda un datetime e restituisca l'ora espressa come decimale. PER ESEMPIO. - 14:33 verrebbe restituito come 14,55perché questa funzione non restituisce i decimali?

ALTER FUNCTION [dbo].[GetTimeAsDecimal](
@DateTime as datetime 
) RETURNS decimal 
AS 
BEGIN 
DECLARE @hour decimal 
DECLARE @min decimal 
DECLARE @result decimal 
SELECT @hour = DATEPART(HOUR, @DateTime) 
SELECT @min = (DATEPART(MINUTE, @DateTime)/60.0) 
SELECT @result = @hour + @min 
RETURN @result 
END 

una query simile produce i risultati attesi ...

SELECT DATEPART(HOUR, getDate()) + (DATEPART(MINUTE, getDate())/60.0) 
+0

Non 2:33 tradurre in 14,55 (come 33/60 = 0,55)? Inoltre, se la query simile funziona, perché non usarla? – LittleBobbyTables

+0

Sì, quel bit era un refuso. È corretto Ho davvero bisogno di dirti perché preferirei avere una funzione? –

+0

No, suppongo di no :) – LittleBobbyTables

risposta

12

E restituisce un decimal - ma poiché non è stata specificata una precisione e una scala, per impostazione predefinita è una scala (numero di cifre dopo il punto decimale) di 0 ...... quindi Puoi ottenere un decimale senza cifre dopo il punto decimale ... (quindi sarà arrotondato e potrebbe sembrare che non sia realmente un decimale - lo è).

È necessario modificare tutte le definizioni per decimal in qualcosa che fa includere una scala! Qualcosa come decimal(18,4) o qualcosa del genere.

Una definizione di decimal(18,4) significa:

  • un totale di 18 cifre
  • tra cui 4 cifre sono dopo il punto decimale (e quindi 14 prima che)

Il predefinito - se non si specifica altro - è decimal = decimal(18,0)

+0

impressionante. di te molto. –

2

prova a modificare le dichiarazioni come segue:

DECLARE @hour decimal(4,2) 
DECLARE @min decimal(4,2) 
DECLARE @result decimal(4,2) 
+0

e questo ha chiuso l'affare. Grazie. finito con ... alterare la funzione [dbo]. [GetTimeAsDecimal] ( @DateTime come datetime ) restituisce decimale (18,2) AS BEGIN RETURN CAST (CAST ((DATEPART (ORE, @DateTime) /1.0) come decimale (18,2)) + CAST ((DATEPART (MINUTE, @DateTime) /60.0) come decimale (18,2)) come decimale (18,2)) END –

Problemi correlati