2017-02-25 2 views
0

Ich habe den folgenden Code. Ich versuche, die Funktion zu testen, indem ich @Hire_Date Datetime übergebe und sehe, welcher Wert zurückgegeben würde, aber ich bin zu SQL-Server 2012 neu und habe keine Idee, wie ich das tun würde.SQL-Test eine benutzerdefinierte Funktion

Danke.

CREATE FUNCTION dbo.getYearsOfService (@Hire_Date Datetime) 
RETURNS int 
AS BEGIN 

    DECLARE @thisYear int 
    DECLARE @thisMonth int 
    DECLARE @hireYear int 
    DECLARE @hireMonth int 
    DECLARE @yearlengthOfService int 
    DECLARE @monthlengthOfService int 

    SET @thisYear = YEAR(getdate()) 
    SET @thisMonth = MONTH(getdate()) 
    SET @hireYear = YEAR('@Hire_Date') 
    SET @hireMonth = MONTH('@Hire_Date') 

    SET @yearlengthOfService = (@thisYear - @hireYear); 
    SET @monthlengthOfService = (@thisMonth - @hireMonth); 

    IF (@monthlengthOfService < 0) 
     SET @yearlengthOfService = (@yearlengthOfService - 1); 

    RETURN @yearlengthOfService 
END; 
+1

Wussten Sie, dass SQLServer eine eigene Funktion enthält, um den Unterschied zwischen zwei Daten zu finden? https://msdn.microsoft.com/en-GB/library/ms189794.aspx –

Antwort

1

Sie können nur SELECT verwenden:

SELECT dbo.getYearsOfService(GETDATE()) 

oder

SELECT dbo.getYearsOfService(CAST('2021-01-20' as DATETIME)) 

(Vielleicht ist das Einstellungsdatum des nächsten Präsidenten der USA)

Wenn Sie eine Tabelle haben von Daten können Sie auch den Wert in der Tabelle verwenden:

SELECT dbo.getYearsOfService(datecol) 
FROM t; 
+0

Hallo, Bei dem Versuch bekomme ich den Fehler: Konvertierung fehlgeschlagen beim Konvertieren von Datum und/oder Uhrzeit aus Zeichenkette. – rkk

+0

@RajanKerai. . . Dieser Fehler wäre für die ersten beiden Abfragen in dieser Antwort unmöglich. –

0

Sie einfach die Funktion wie diese Abfrage würde:

SELECT dbo.getYearsOfService ('02/25/2017') 
; 

Oder wenn Sie die Funktion gegen einen Datensatz in einer Tabelle verwenden möchten, würden Sie es gegen einen Wert aus dieser Reihe, wie diese Abfrage :

SELECT dbo.getYearsOfService(<ColumnName>) 
FROM <TableName> 
WHERE <SomeColumn> = <SomeValue> 
; 

oder wenn Sie Werte zurückgeben zusammen mit ihm wollte, könnte man es gegen die gesamte Tabelle (oder ein Teil davon), wie folgt ausführen:

HINWEIS:

Bitte beachten Sie, dass in den Körper Ihrer Funktion haben Sie einen Fehler:

SET @hireYear = YEAR('@Hire_Date') 
SET @hireMonth = MONTH('@Hire_Date') 

Sie wollen nicht Strings hier passieren, aber den Parameterwert. Weg mit den Apostrophen und Sie sollten einen sauberen Lauf ohne Fehler erhalten.

SET @hireYear = YEAR(@Hire_Date) 
SET @hireMonth = MONTH(@Hire_Date) 
+0

Hallo, Bei dem Versuch bekomme ich den Fehler: Konvertierung fehlgeschlagen beim Konvertieren von Datum und/oder Uhrzeit aus Zeichenkette. – rkk

+0

Wahrscheinlich, weil Ihr Standard-Datumsformat für die DB anders ist. Versuchen Sie, das Datumsformat von Monat/Tag/Jahr auf Tag/Monat/Jahr umzustellen, also "25/02/2017". Wenn Sie diesen Fehler erhalten, wenn Sie versuchen, den Wert einer Spalte auszuführen, dann enthält diese Spalte anscheinend einen Wert, der nicht richtig formatiert ist, um an die Funktion übergeben zu werden. Können Sie mir sagen, welchen Wert Sie an die Funktion übergeben wollten? – 3BK

+0

Ich habe versucht mit dem Wert ('02/25/2017 '), aber diese Funktion ist Teil eines größeren Programms, wo ich Daten in einer Spalte für andere Tabellen überprüfen muss. Die Daten in dieser Spalte sind wie folgt formatiert: '2003-06-28 17: 11: 25.000'. Ich habe beide Funktionen, die Sie geschrieben haben, ausprobiert - ein Datum manuell und gegen einen Datensatz in einer Tabelle eingegeben und den gleichen Fehler erhalten. – rkk

Verwandte Themen