[퀴즈]윤년 구하기 1 11 7,117

by camela 윤년 [2011.03.14 17:54:49]


책에 윤년을 구하는 간단한 방법이 나와서 함 올려봅니다.
아시는 분들도 많을 듯 하지만 모르시는 분들은 참고하시면 좋을 것 같네요.

with cal as
(
select '1900' + level - 1 as year
from   dual
connect by level <= 400
)
select year
from   cal
;

위 쿼리를 실행시키면 아래처럼 나오는데
year
1900
1901
1902
1903
1904
1905
1906
1907
1908
...

아래처럼 윤년이면 Y 아니면 N 이 나오는 쿼리를 구하시면 됩니다.
year leap_year
1900 N
1901 N
1902 N
1903 N
1904 Y
1905 N
1906 N
1907 N
1908 Y
...

by 현 [2011.03.15 09:14:03]
with cal as
(
select '1900' + level - 1 as year
from dual
connect by level <= 400
)
select year, decode(mod(year,4),0,'Y','N') leap_year
from cal
;


그런데 보기에서 1900년은 Y로 되어야 하는거 아닌가요?

by t [2011.03.15 09:39:19]
1900년은 윤년이긴한데 가지를 처낸 윤년이라고해서 실질적으로 날짜를 넣진 않습니다.
4의 배수는 윤년
100의 배수는 윤년아님
400의 배수는 윤년

by camela [2011.03.15 09:41:13]
4로 나누어 떨어지는 해는 우선 윤년으로 하고, ② 그 중에서 100으로 나누어 떨어지는 해는 평년으로 하며, ③ 다만 400으로 나누어 떨어지는 해는 다시 윤년으로 정하였다
[출처] 윤년 [閏年, leap year ] | 네이버 백과사전

윤년이란게 단순히 4년마다 한번씩 되는것이 아니라 위에처럼 되는 것이네요.

by elmore [2011.03.15 10:04:20]
with cal as
(
select '1900' + level - 1 as year
from dual
connect by level <= 400
)
SELECT YEAR,
CASE WHEN MOD(YEAR,4)=0 AND (MOD(YEAR,100) != 0 OR MOD(YEAR,400) =0) THEN 'Y' ELSE 'N' END
FROM CAL;

by 문두 [2011.03.15 10:13:01]
with cal as
(
select '1900' + level - 1 as year
from dual
connect by level <= 400
)
SELECT YEAR
, CASE WHEN MOD(YEAR,400) = 0 THEN 'Y'
WHEN MOD(YEAR,100) = 0 THEN 'N'
WHEN MOD(YEAR,4) = 0 THEN 'Y'
ELSE 'N'
END AS LEAP_YEAR
FROM CAL
맞나용 ㅡㅡ;?

by 현 [2011.03.15 10:19:53]
아하...
윤년이 100년마다는 안치는 거군요..

첨 알았네요...^^

by camela [2011.03.15 10:42:46]
elmore님과 문두님 맞습니다.
저두 elmore님처럼 풀었는데요 책의 저자는 last_day 함수를 이용하는 방법을 보여주네요.

decode(to_char(last_day(add_months(trunc(to_date(year,'YYYY'),'y'),1)),'DD'),'29','Y','N')

last_day 함수가 윤년을 구해서 2월달이 28일인지 29일인지를 알 수 있으므로 이것을 이용한 방식입니다.

SQL Cookbook 에 나와 있습니다.

by 마농 [2011.03.15 13:26:23]
WITH cal AS
(
SELECT '1900' + LEVEL - 1 AS year
FROM dual
CONNECT BY LEVEL <= 400
)
SELECT year
, DECODE(0, MOD(year, 400), 'Y', MOD(year, 100), 'N', MOD(year, 4), 'Y', 'N') leap_year
, DECODE(TO_CHAR(TO_DATE(year||'1231', 'yyyymmdd'), 'ddd'), '366', 'Y', 'N') leap_year
, DECODE(TO_CHAR(TO_DATE(year||'03', 'yyyymm') - 1, 'dd'), '29', 'Y', 'N') leap_year
FROM cal
;

by 현재훈 [2011.03.29 18:43:43]
with cal as
(
select '1900' + level - 1 as year
from dual
connect by level <= 400
)
select year,
case when mod(year,400) then 'Y'
when mod(year, 100) then 'N'
when mod(year, 4) then 'Y' end Y/N
from cal
;


by 소는누가키워 [2011.06.14 14:59:55]
with cal as
(
select '1900' + level - 1 as year
from dual
connect by level <= 400
)
/* Formatted on 2011/06/14 14:57 (Formatter Plus v4.8.8) */
SELECT YEAR,
(CASE
WHEN MOD (YEAR, 4) = 0 AND MOD (YEAR, 100) <> 0
OR MOD (YEAR, 400) = 0
THEN 'Y'
ELSE 'N'
END
) yun
FROM cal
;

by ljw [2011.12.23 17:56:02]
with cal as
(
select '1900' + level - 1 as year
from dual
connect by level <= 400
)

select year, mod(year, 4), mod(year, 100), mod(year, 400),
decode(0, mod(year,400), 'Y', mod(year, 100), 'N', mod(year, 4), 'Y', 'N') syear
from cal
;
--날짜를 이용한 방법도 있었네요, 하나 배웠습니다 감사합니다.
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입