CREATE TABLE TB_DATE (
[Date] datetime
, [Year] smallint
, [Quarter] tinyint
, [Month] tinyint
, [Day] smallint -- from 1 to 366 = 1st to 366th day in a year
, [Week] tinyint -- from 1 to 54 = the 1st to 54th week in a year;
, [Monthly_week] tinyint -- 1/2/3/4/5=1st/2nd/3rd/4th/5th week in a month
, [Week_day] tinyint -- 1=Mon, 2=Tue, 3=Wed, 4=Thu, 5=Fri, 6=Sat, 7=Sun
)
WITH C0 AS (SELECT c FROM (VALUES(1),(1)) AS D(c)),
C1 AS (SELECT 1 AS c FROM C0 AS A CROSS JOIN C0 AS B),
C2 AS (SELECT 1 AS c FROM C1 AS A CROSS JOIN C1 AS B),
C3 AS (SELECT 1 AS c FROM C2 AS A CROSS JOIN C2 AS B),
C4 AS (SELECT 1 AS c FROM C3 AS A CROSS JOIN C3 AS B),
C5 AS (SELECT 1 AS c FROM C4 AS A CROSS JOIN C3 AS B),
C6 AS (select rn=row_number() over (order by c) from C5),
C7 as (select [date]=dateadd(day, rn-1, '19000101') FROM C6 WHERE rn <= datediff(day, '19000101', '99991231')+1)
INSERT INTO TB_DATE ([year], [quarter], [month], [week], [day], [monthly_week], [week_day], [date])
SELECT datepart(yy, [DATE]), datepart(qq, [date]), datepart(mm, [date]), datepart(wk, [date])
, datediff(day, dateadd(year, datediff(year, 0, [date]), 0), [date])+1
, datepart(week, [date]) -datepart(week, dateadd(month, datediff(month, 0, [date]) , 0))+1
, CASE WHEN datepart(dw, [date])+@@datefirst-1 > 7 THEN (datepart(dw, [date])+@@datefirst-1)%7 ELSE datepart(dw, [date])+@@datefirst-1 END
, [date]
FROM C7
WITH tmp AS (
SELECT idx=1, dt = cast('20090101' AS datetime) UNION ALL SELECT idx = idx + 1, dt = dateadd(d, 1, dt)
FROM tmp WHERE dt < cast('20101231' AS datetime) )
SELECT dt , year = datepart(year, dt) , month = datepart(month, dt) ,
day = datepart(day, dt) , weekofyear = datepart(wk , dt) , weekofmonth = datepart(wk, dt) - datepart(wk, left(convert(varchar, dt, 112), 6)+ '01') + 1 ,
요일 = datename(w, dt) , 분기 = datepart(q, dt) , 반기 = case when datepart(month,dt) BETWEEN 1 AND 6 then '상반기' else '하반기' end
FROM tmp OPTION (maxrecursion 0)
'MS-SQL' 카테고리의 다른 글
[MSSQL] 서버 저장소 남은용량 (0) | 2022.04.28 |
---|---|
[MSSQL] 달력 테이블 만들기 (0) | 2021.12.09 |
[MS-SQL] 설치된 트리거 리스트 확인 (0) | 2017.08.25 |
[MS-SQL] ID 열의 명시적 값은 열 목록이 사용되고 IDENTITY_INSERT가 ON일 때만 지정할 수 있습니다 (0) | 2016.12.27 |
[MS-SQL] 조건문 (0) | 2016.04.07 |