2010-07-11 23 views
5

Ich möchte diese Funktion eine Datetime und geben Sie die Zeit als Dezimalzahl zurückgegeben. Z.B. - 14.33 würde wieder als 14,55Warum gibt diese Funktion nicht dezimal zurück?

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 

Eine ähnliche Abfrage, um die erwarteten Ergebnisse erzeugt ...

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

Nicht 2:33 übersetzt in 14,55 (wie 33/60 = 0,55)? Wenn die ähnliche Abfrage funktioniert, warum nicht verwenden? – LittleBobbyTables

+0

Ja, das war ein Tippfehler. Es ist korrigiert. Muss ich dir wirklich sagen, warum ich lieber eine Funktion hätte? –

+0

Nein, nehme ich nicht an :) – LittleBobbyTables

Antwort

12

Es tut geben Sie eine decimal - aber da Sie keine Genauigkeit und Skalierung angegeben haben, ist es standardmäßig auf eine Skala (Anzahl der Stellen nach dem Komma) von 0 ...... so y Sie erhalten eine Dezimalzahl ohne irgendwelche Nachkommastellen ... (also wird es abgerundet und sieht so aus, als ob es nicht wirklich eine Dezimalzahl ist - es ist).

Sie müssen alle Ihre Definitionen für decimal zu etwas ändern, das enthält eine Skala enthalten! So etwas wie decimal(18,4) oder so.

Eine Definition decimal(18,4) bedeutet:

  • insgesamt 18 Digits
  • davon 4 Ziffern nach dem Dezimalpunkt sind (und somit 14 davor)

DEFAULT - wenn Sie geben nichts anderes an - ist decimal = decimal(18,0)

+0

genial. als du sehr. –

2

Versuchen Sie, Ihre Erklärungen wie folgt zu ändern:

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

und dieses Bit schloss den Deal. Vielen Dank. mit endete ... ALTER FUNCTION [DBO]. [GetTimeAsDecimal] ( @DateTime als Datum- ) RETURNS decimal (18,2) AS BEGIN RETURN CAST (CAST ((DATEPART (Stunde, @DateTime) /1.0) als Dezimal (18,2)) + CAST ((DATEPART (MINUTE, @DateTime)/60.0) als Dezimal (18,2)) als Dezimal (18,2)) END –

Verwandte Themen