MS SQL中的闰年问题给出了同年的不同结果

时间:2011-03-04 10:19:19

标签: sql sql-server-2008

我遇到了一个奇怪的问题。我有一个函数dbo.ufn_GetDaysInYear,如果我手工传递dbo.ufn_GetDaysInYear('2008'),它似乎能给出正确的结果。但如果我不这样做,我会像dbo.ufn_GetDaysInYear(YEAR(@dataKoncowa))那样传递它,它会在同一年给出不同的结果。

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

我错过了什么?

1 个答案:

答案 0 :(得分:1)

Year()函数返回INT数据类型的值。 您的函数需要DATETIME值