2011-06-30 54 views
8

Bir yılın bir yıl olup olmadığını nasıl kontrol ederim?Artık yıl için kontrol edin

declare @year int 
set @year = 1968 

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

Beklenen sonuç: 29 Şubat için

LEAP YEAR 

cevap

29

kontrol:

Bu kodu vardır

CASE WHEN ISDATE(CAST(@YEAR AS char(4)) + '0229') = 1 THEN 'LEAP YEAR' ELSE 'NORMAL YEAR' END 

veya kullanım aşağıdaki kural

CASE WHEN (@YEAR % 4 = 0 AND @YEAR % 100 <> 0) OR @YEAR % 400 = 0 THEN 'LEAP YEAR'... 
+0

fi Birincisi parlak! – Alex

+0

Tam olarak ihtiyacım olan şey, teşekkürler! – Lexi847942

3

Artık yıl hesaplama: Bu doğru olduğunda

(@year % 4 = 0) and (@year % 100 != 0) or (@year % 400 = 0) 

, o zaman bir artık yıl. Veya case ifadesi koymak

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

Bu ifade asla doğru olamaz ... – gbn

+0

güncellenmiş bir cevabında yaptığınız gibi bir 'AND' güncellendi. Bunu kanıtlamak için SQL'de test ediyordum. Yani ikimiz de aynı hesaplama ile cevap verdik. –

1

Ben Bu aynı zamanda yardımcı olabilecek

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 

-2
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); 
+2

bu sql-server değildir ve arkasındaki matematik yanlış –

+1

Test modulo 4 yeterli değildir. Buraya bakın: [http://stackoverflow.com/a/725111/818827](http://stackoverflow.com/a/725111/818827) –

0
select decode(mod(&n,4),0,'leap year' ,'not a leapyear') as CHECK_LEAPYEAR from dual 
+0

Bu Guys'i Deneyin, Basit –

+0

Evet, çok da zor değil –

+1

sql-server ve arkasındaki matematik yanlış –

2

kullanmaktan çekinmeyin daha iyi bir çözüm

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