【发布时间】:2026-01-26 12:30:01
【问题描述】:
我编写代码来确定一年中有多少天。我试图让它变得非常简单。 我发现我认为确定闰年的代码非常干净。我正在使用 DATEPART(Y,@Year) 将输入的日期传递给闰年程序,并且有些方法没有得到正确的结果,所以我必须在我的 SQL 代码中处理输入日期,因为返回了正确的位。
这是闰年的代码:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER FUNCTION [dbo].[FN_Is_Leap_Year]
(
-- the parameters for the function here
@year int
)
RETURNS BIT
AS
BEGIN
RETURN (select case datepart(mm, dateadd(dd, 1, cast((cast(@year as varchar(4)) + '0228') as datetime)))
WHEN 2 THEN 1
ELSE 0 END)
END
这是我为处理输入日期并获取一年中的 # 天而编写的代码:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER FUNCTION [dbo].[FN_Get_Days_In_Year]
(
@InputDT varchar(10)
)
RETURNS int
AS
BEGIN
DECLARE @Result int,
@Year int
Set @Result =
CASE
WHEN dbo.FN_Is_Leap_Year(Datepart(yyyy,@Year)) = 0 Then 365
WHEN dbo.FN_Is_Leap_Year(Datepart(yyyy,@Year)) = 1 Then 366
END
RETURN @Result
END
【问题讨论】:
-
在最后一段代码中,为什么在
CASE语句中调用函数(dbo.FN_Is_Leap_Year) 2次?你应该使用CASE dbo.FN_Is_Leap_Year(Datepart(yyyy,@Year)) WHEN 0 THEN 365 ELSE 366 END。哎呀,我会转储第一个函数并将其一行代码拉入CASE。 -
SELECT 1 + DATEDIFF(day, CAST(@year AS VARCHAR(4)) + '-01-01', CAST(@year AS VARCHAR(4)) + '-12-31');?
标签: tsql variables user-defined-functions