2010-07-11 26 views
5

Quiero que esta función tome una fecha y devuelva el tiempo expresado como un decimal. P.EJ. - 14:33 sería devuelto como 14,55¿por qué esta función no devuelve decimal?

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 consulta similar produce los resultados esperados ...

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

¿No se traduce 2:33 a 14.55 (como 33/60 = 0.55)? Además, si la consulta similar funciona, ¿por qué no usar eso? – LittleBobbyTables

+0

Sí, ese bit fue un error tipográfico. Esta corregido ¿Realmente necesito decirte por qué preferiría tener una función? –

+0

No, supongo que no :) – LittleBobbyTables

Respuesta

12

Se devuelve un decimal - pero como no especificó una precisión y una escala, de forma predeterminada tiene una escala (número de dígitos después del punto decimal) de 0 ...... por lo tanto obtienes un decimal sin ningún dígito después del punto decimal ... (por lo que se redondeará y puede parecer que no es realmente un decimal, lo es).

Necesita cambiar todas sus definiciones para decimal a algo que tiene ¡incluya una escala! Algo así como decimal(18,4) o algo así.

Una definición de decimal(18,4) significa:

  • un total de 18 dígitos
  • de los cuales 4 dígitos son después del punto decimal (y por lo tanto 14 antes de que)

El defecto - si no especifica nada más - es decimal = decimal(18,0)

+0

awesome. que tú mucho –

2

trate de cambiar su declaración de la siguiente manera:

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

y este bit cerró el trato. Gracias. terminó con ... alterar la función [dbo]. [GetTimeAsDecimal] ( @DateTime como fecha y hora ) VUELVE decimal (18,2) COMO COMENZAR REPARTO DE DEVOLUCIÓN (CAST ((DATEPART (HORA, @DateTime) /1.0) como decimal (18,2)) + CAST ((DATEPART (MINUTE, @DateTime) /60.0) como decimal (18,2)) como decimal (18,2)) END –

Cuestiones relacionadas