Tsql 检查闰年

Tsql 检查闰年,tsql,math,Tsql,Math,如何检查一年是否为闰年 我有以下代码: declare @year int set @year = 1968 SELECT CASE WHEN @YEAR = <LEAPYEAR> THEN 'LEAP YEAR' ELSE 'NORMAL YEAR' END 2月29日支票: CASE WHEN ISDATE(CAST(@YEAR AS char(4)) + '0229') = 1 THEN 'LEAP YEAR' ELSE 'NORMAL YEAR' END 或者使用以下规

如何检查一年是否为闰年

我有以下代码:

declare @year int
set @year = 1968

SELECT CASE WHEN @YEAR = <LEAPYEAR> THEN 'LEAP YEAR' ELSE 'NORMAL YEAR' END
2月29日支票:

CASE WHEN ISDATE(CAST(@YEAR AS char(4)) + '0229') = 1 THEN 'LEAP YEAR' ELSE 'NORMAL YEAR' END
或者使用以下规则

CASE WHEN (@YEAR % 4 = 0 AND @YEAR % 100 <> 0) OR @YEAR % 400 = 0 THEN 'LEAP YEAR'...
当(@YEAR%4=0和@YEAR%100 0)或@YEAR%400=0时,则为“闰年”。。。
闰年计算:

(@year % 4 = 0) and (@year % 100 != 0) or (@year % 400 = 0)
如果这是真的,那就是闰年。或者把它放在案例陈述中

select case when
    (
        (@year % 4 = 0) and (@year % 100 != 0) or
        (@year % 400 = 0)
    ) then 'LEAP' else 'USUAL' end
;

我有一个更好的解决办法

CREATE FUNCTION dbo.IsLeapYear(@year INT)
RETURNS BIT AS  
     BEGIN
          DECLARE @d DATETIME,
                  @ans BIT      
          SET @d = CONVERT(DATETIME,'31/01/'+CONVERT(VARCHAR(4),@year),103)
          IF DATEPART(DAY,DATEADD(MONTH,1,@d))=29 SET @ans=1 ELSE SET @ans=0
          RETURN @ans
    END
GO
请随意使用

这也会有所帮助

DECLARE @year INT = 2012

SELECT IIF(DAY(EOMONTH(DATEFROMPARTS(@year,2,1))) = 29,1,0)  
Result: 1 --(1 if Leap Year, 0 if not)

SELECT IIF(DAY(EOMONTH(DATEFROMPARTS(@year,2,1))) = 29,'Leap year','Not Leap year')  
Result: Leap year 

最有效的闰年测试:

CASE WHEN @YEAR & 3 = 0 AND (@YEAR % 25 <> 0 OR @YEAR & 15 = 0) THEN ...
当@YEAR&3=0和(@YEAR%25 0或@YEAR&15=0)时,则。。。

改编自:

不确定这与其他解决方案相比有多高效。但这是另一种选择

DECLARE @year int = 2016
SELECT CASE 
  WHEN DATEPART(dayofyear, DATEFROMPARTS(@year, 12, 31)) = 366
  THEN 'LEAP' 
  ELSE 'NOT LEAP' 
END

3行。。。但也可能是2

DECLARE @Y as int = 2021;
DECLARE @Dt as char(10) = CAST(@Y as CHAR(4)) + '-02-29'
SELECT IIF(isDATE(@Dt) = 1, 1,0)


Alen

更新了一个
,与您在更新的答案中所做的相同。我只是在SQL中测试它来证明它。所以我们都用同样的计算来回答。第一个很精彩!的确,第一个是聪明的;但是有一个相对较大的隐藏计算成本。第二个执行速度明显更快。下面,我消除了3个模运算中的2个,从而消除了比按位运算慢的除法运算。(见下文“最有效的闰年测试”)请使用此方法,因为它检查的是全年,而不是公认的答案,最初只检查闰年日,而不是全年。
DECLARE @Y as int = 2021;
DECLARE @Dt as char(10) = CAST(@Y as CHAR(4)) + '-02-29'
SELECT IIF(isDATE(@Dt) = 1, 1,0)
DECLARE @Dt as char(10) = '2020-02-29'
SELECT IIF(isDATE(@Dt) = 1, 1,0)