我有一個奇怪的問題。我有一個函數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
我在想什麼?
你有沒有試過'SELECT dbo.ufn_GetDaysInYear(2008)'(傳遞一個int而不是一個字符串)? – jswolf19 2011-03-04 10:23:16
'SELECT dbo.ufn_GetDaysInYear(2008)'returns 365 – MadBoy 2011-03-04 10:28:29
這就是你的問題,整數2008沒有按照你期望的方式轉換爲DATETIME。有沒有理由讓你傳遞'YEAR(@dataKoncowa)'而不是傳遞'@ dataKoncowa'? – jswolf19 2011-03-04 10:38:22