Проверьте на високосный год - PullRequest
10 голосов
/ 30 июня 2011

Как проверить, является ли год високосным?

У меня есть этот код:

declare @year int
set @year = 1968

SELECT CASE WHEN @YEAR = <LEAPYEAR> THEN 'LEAP YEAR' ELSE 'NORMAL YEAR' END

Ожидаемый результат:

LEAP YEAR

Ответы [ 8 ]

38 голосов
/ 30 июня 2011

Проверьте на 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'...
3 голосов
/ 10 декабря 2018

НАИБОЛЕЕ ЭФФЕКТИВНЫЙ ПРОВЕДЕНИЕ ГОДА:

CASE WHEN @YEAR & 3 = 0 AND (@YEAR % 25 <> 0 OR @YEAR & 15 = 0) THEN ...

Адаптировано из: http://stackoverflow.com/a/11595914/3466415

3 голосов
/ 30 июня 2011

Расчет високосного года:

(@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
;
2 голосов
/ 22 октября 2014

Это также может помочь

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 
1 голос
/ 30 июля 2013

У меня есть лучшее решение

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

Не стесняйтесь использовать

0 голосов
/ 05 апреля 2019

Я схожу с ума, но разве это не так просто, как

CASE WHEN (@YEAR % 4 = 0) THEN 'LEAP YEAR' ELSE 'NORMAL YEAR' END
0 голосов
/ 23 августа 2013
select decode(mod(&n,4),0,'leap year' ,'not a leapyear') as CHECK_LEAPYEAR  from dual
0 голосов
/ 23 августа 2013
select

CASE

  WHEN result = 0 THEN 'Leap_Year'

  WHEN result <> 0 THEN 'Not_A_Leap_Year'

END

from(select mod((EXTRACT(YEAR FROM DATE '2013-08-23')), 4) result FROM DUAL);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...