2011-03-04 52 views
0

我有一個奇怪的問題。我有一個函數dbo.ufn_GetDaysInYear,如果我一年通過dbo.ufn_GetDaysInYear('2008'),它似乎會給出正確的結果。但如果我不這樣做,但我通過它像dbo.ufn_GetDaysInYear(YEAR(@dataKoncowa))它給同一年不同的結果。MS SQL中的閏年問題給出了同一年的不同結果

DECLARE @dataNaDzien DATETIME 
SET @dataNaDzien = '20080101' 

DECLARE @dataPoczatkowa DATETIME 
DECLARE @dataKoncowa DATETIME 
DECLARE @iloscDniRok INT 
SET @dataPoczatkowa = DATEADD(dd, 0, DATEDIFF(dd, 0, @dataNaDzien)) 
SET @dataKoncowa = @dataPoczatkowa + '23:59:59' 
SET @iloscDniRok = dbo.ufn_GetDaysInYear(YEAR(@dataKoncowa)) 

SELECT @dataKoncowa -- Result 2008-01-01 23:59:59.000 
SELECT YEAR(@dataKoncowa) -- Result 2008 
SELECT dbo.ufn_GetDaysInYear(YEAR(@dataKoncowa)) -- Result 365 
SELECT dbo.ufn_GetDaysInYear('2008') --Result 366 

下面是功能:

USE [Baza] 
GO 
/****** Object: UserDefinedFunction [dbo].[ufn_IsLeapYear] Script Date: 03/04/2011 11:17:36 ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
ALTER FUNCTION [dbo].[ufn_IsLeapYear] (@pDate DATETIME) 
RETURNS BIT 
AS 
BEGIN 

    IF (YEAR(@pDate) % 4 = 0 AND YEAR(@pDate) % 100 != 0) OR 
     YEAR(@pDate) % 400 = 0 
     RETURN 1 

    RETURN 0 

END 


USE [Baza] 
GO 
/****** Object: UserDefinedFunction [dbo].[ufn_GetDaysInYear] Script Date: 03/04/2011 11:17:34 ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
ALTER FUNCTION [dbo].[ufn_GetDaysInYear] (@pDate DATETIME) 
RETURNS INT 
AS 
BEGIN 

    RETURN 365 + [dbo].[ufn_IsLeapYear] (@pDate) 

END 

我在想什麼?

+0

你有沒有試過'SELECT dbo.ufn_GetDaysInYear(2008)'(傳遞一個int而不是一個字符串)? – jswolf19 2011-03-04 10:23:16

+0

'SELECT dbo.ufn_GetDaysInYear(2008)'returns 365 – MadBoy 2011-03-04 10:28:29

+0

這就是你的問題,整數2008沒有按照你期望的方式轉換爲DATETIME。有沒有理由讓你傳遞'YEAR(@dataKoncowa)'而不是傳遞'@ dataKoncowa'? – jswolf19 2011-03-04 10:38:22

回答

1

Year()函數返回INT數據類型的值。 你的函數期望DATETIME值

+0

'SELECT dbo.ufn_GetDaysInYear(@dataKoncowa)'似乎給出了正確的結果......所以你是對的。 – MadBoy 2011-03-04 10:31:21