我遇到了一个奇怪的问题。我有一个函数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
我错过了什么?
答案 0 :(得分:1)
Year()函数返回INT数据类型的值。 您的函数需要DATETIME值