2017-02-25 42 views
0

我有以下代碼。我試圖通過傳遞@Hire_Date Datetime來測試函數,看看會返回什麼值然而,我是SQL Server 2012的新手,不知道如何去做這件事。SQL測試用戶定義函數

謝謝。

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

您是否知道SQLServer包含自己的函數來查找兩個日期之間的差異? https://msdn.microsoft.com/en-GB/library/ms189794.aspx –

回答

1

你可以用SELECT

SELECT dbo.getYearsOfService(GETDATE()) 

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

(也許租用美國的下一任總統的日期),如果你有一個表的日期,您也可以使用表中的值:

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

嗨, 在試圖這個我得到的錯誤:轉換日期和/或時間從字符串轉換失敗。 – rkk

+0

@RajanKerai。 。 。這個錯誤對於這個答案中的前兩個查詢是不可能的。 –

0

你只查詢這樣的功能:

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

或者,如果你想使用的功能對一個表中的記錄,你會質疑它針對的值從該行,像這樣:

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

或者,如果你想與它一起返回值,你可以對整個表運行它(或它的一部分),像這樣:

SELECT <Column1>, <Column2>, <Column3>, dbo.getYearsOfService(<ColumnName>) AS <WhateverNameYouWant> 
FROM <TableName> 
WHERE <SomeColumn> = <SomeValue> -- Optional WHERE Clause 
; 

注:

請注意,在你的函數體,你有一個錯誤:

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

你不想在這裏過琴絃,但參數值。去掉撇號,你應該得到一個乾淨的運行沒有錯誤。

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

嗨, 嘗試這個我得到的錯誤:轉換日期和/或時間從字符串轉換失敗。 – rkk

+0

可能因爲您的數據庫的默認日期格式不同。嘗試將日期格式從月/日/年轉換爲日/月/年,所以'25/02/2017'。 如果在嘗試運行列的值時遇到該錯誤,那麼顯然該列保存的值未正確格式化以傳遞給該函數。你能告訴我你試圖傳遞給函數的哪個值嗎? – 3BK

+0

我正在嘗試使用值('02/25/2017'),但是這個函數是一個更大程序的一部分,我需要檢查另一個表的列中的日期。該列中的日期格式爲:'2003-06-28 17:11:25.000'。 我試過了你寫的兩個函數 - 手動輸入日期和表中的記錄並得到相同的錯誤。 – rkk