sql - 연도 일/월 변환

sql - 연도 일/월 변환

다음 테이블이 있다고 가정합니다.

+-----------+-------------+
|    DAY    |  LEAP YEAR  |
+-----------+-------------+
|    7      |    true     |
|    167    |    false    |
|    43     |    true     |
|    60     |    true     |
|    256    |    false    |
|    340    |    false    |
+-----------+-------------+

SQL 함수만 사용하면 이 연도를 실제 날짜/월 조합으로 어떻게 "변환"할 수 있습니까? 결과는 다음과 같습니다:

+-----------+-------------+------------+
|    DAY    |  LEAP YEAR  |   RESULT   |
+-----------+-------------+------------+
|    7      |    true     |   7 Jan    |
|    167    |    false    |   16 Jun   |
|    43     |    true     |   12 Feb   |
|    60     |    true     |   29 Feb   |
|    256    |    false    |   13 Sep   |
|    340    |    false    |   6 Dec    |
+-----------+-------------+------------+

답변1

윤년의 깔끔한 속성은 모두 동일하다는 것입니다(약 100년을 제외하고). 따라서 윤년이나 윤년이 아닌 연도를 선택하고 다른 모든 해에 대해 동일한 결과를 얻을 수 있습니다. 예를 들어 2016년은 윤년이고 2015년은 윤년이 아닙니다. 해당 정보가 주어지면 날짜 형식 지정 도구 DDD(날짜년도) 몇 가지 case표현을 사용하여 필요한 정보를 얻으세요.

SELECT TO_CHAR(
         TO_DATE(TO_CHAR(day) || 
                 '-' || 
                 CASE leap_year 
                   WHEN 'true' THEN '2016' 
                   ELSE '2015' 
                 END, 
                'DDD-YYYY'), 
         'dd month') AS result
FROM   my_table

답변2

빠르고 더러운 방법: 윤년이 아닌 해와 윤년인 해를 선택하세요. 날짜 = 매년 1월 1일을 두 변수에 넣습니다. CASE 문을 사용하여 (일 값 - 1) 및 적절한 날짜 변수를 더합니다. 그런 다음 Case 문이나 추가 SQL을 사용하여 이 표현식에서 월 이름과 날짜를 가져옵니다.

declare @normal_year_nyd date = '1-1-2015';
declare @leap_year_nyd date = '1-1-2016';
select 
  t.[day], -- highly suggest naming this something other than 'day' to avoid ambiguous code
  t.leap_year, 
  datename(month, dateadd(day, t.[day] - 1, 
    case 
      when t.leap_year = 'false' 
        then @normal_year_nyd
      when t.leap_year = 'true'
        then @leap_year_nyd
      end)
  ) as month_name,
  -- do the same as above replacing "month" with "day" in the dateadd expression
from my_table t
where t.leap_year is not null and t.[day] is not null

Null을 처리해야 하는 경우 외부에 대/소문자를 사용하여 표현식을 다시 작성하고 Null에 대한 분기를 추가해야 합니다.

이것이 순전히 select 문이어야 한다면 변수를 사용하는 대신 case 문의 날짜를 하드 코딩하면 됩니다.

관련 정보