안녕하세요. Informix에는 연도별 주차를 계산하는 기능이 없어서 찾아보다가 다른 코드를 보고 따라서 만들어 보았습니다. 주차에 대한 개념이 없다보니 커뮤니티와 블로그, 위키 자료들을 참고했는데요. 일반적으로 쓰이는 형태가 ISO 8601 표준이라고 합니다.
ISO 8601에 따르면 1주차에 대한 정의는 아래와 같습니다.
- 시작 연도의 첫 번째 목요일이 포함된 주
- 1월 4일이 있는 주
- 시작 연도에 일의 대부분(4일 이상)이 있는 첫 번째 주
- 12월 29일 - 1월 4일 기간의 월요일로 시작하는 주
아래와 같이 다양한 DBMS에서 함수를 사용하여 특정일자에 대한 주차를 구할 수 있습니다만.. Informix는 자체 기능이 제공되지 않아서 아쉽군요.
DBMS | 제공함수 | 사용예시 |
Oracle | TO_CHAR | TO_CHAR(DATE '2021-08-25' , 'IW') |
Db2 | TO_CHAR | TO_CHAR(DATE '2021-08-25' , 'IW') |
MySQL | WEEK | WEEK('2021-08-25', 3); |
MariaDB | WEEK | WEEK('2021-08-25', 3); |
SQL Server | DATEPART | DATEPART(ISOWK,'2021-08-25') |
PostgreSQL | DATE_PART / EXTRACT | DATE_PART('WEEK', '2021-08-25'::DATE) EXTRACT('WEEK' FROM '2021-08-25'::DATE) |
Sybase | DATEPART | DATEPART(CWK, '8/25/2021') |
Informix에는 기본 내장된 함수가 없기 때문에 계산 방식에 대해서 조사를 했습니다.
위에서 상술된 조건을 만족해야하고, Informix에서 datetime 을 일자로 변환하여 계산하는 등의 몇가지 시행착오가 있었습니다.
create function weeknum ( dt varchar(10) )
returning int;
define wknum int;
select trunc(((to_date(dt, '%Y-%m-%d') - yearstart)::interval day(3) to day::varchar(12)::integer) / 7) + 1
into wknum
from
(
select case when nextyr <= to_date(dt, '%Y-%m-%d') then nextyr
when curryr <= to_date(dt, '%Y-%m-%d') then curryr
else prioryr
end yearstart
from
(
select
mdy(1,1,1753) + trunc(((jan4 - 1 units year - mdy(1,1,1900) + 53690 units day)::varchar(12)::integer) / 7) * 7 units day prioryr,
mdy(1,1,1753) + trunc(((jan4 - mdy(1,1,1900) + 53690 units day)::varchar(12)::integer) / 7) * 7 units day curryr,
mdy(1,1,1753) + trunc(((jan4 + 1 units year - mdy(1,1,1900) + 53690 units day)::varchar(12)::integer) / 7) * 7 units day nextyr
from (
select mdy(1,1,1900) + (extend (to_date(dt, '%Y-%m-%d'), year to year) - mdy (1,1,1900))::varchar(12)::integer units year + 3 units day jan4 from dual
)
)
);
return wknum;
end function;
아래와 같은 방식으로 Informix에서 특정 일자에 대한 주차를 구할 수 있습니다. 위 함수를 수정하면 쿼리형태로도 사용 가능할 것 같습니다.
> select weeknum ('2021-08-25') from sysmaster:sysdual;
(expression)
34
https://en.wikipedia.org/wiki/ISO_8601
https://en.wikipedia.org/wiki/ISO_week_date
https://www.toolbox.com/tech/oracle/question/how-the-week-number-is-being-derived-121815/
https://www.sqlteam.com/forums/topic.asp?TOPIC_ID=60515
http://www.whitemiceconsulting.com/informixintervaltips201609
https://www.sqlservercentral.com/articles/a-simple-formula-to-calculate-the-iso-week-number
https://4js.com/online_documentation/fjs-fgl-3.00.05-manual-html/c_fgl_odiagmsv_005.html
'Informix > informix reference' 카테고리의 다른 글
테이블을 특정 시점으로 복구하는 기능 (0) | 2022.06.27 |
---|---|
DBeaver에서 인포믹스 한글 깨짐 해결 (0) | 2022.05.02 |
Round robin 테이블 기능 개선 (0) | 2021.10.20 |
QUERY TIMEOUT 설정 (0) | 2021.10.20 |
테이블과 인덱스를 자동으로 배치하기 (AUTOLOCATE) (0) | 2021.07.21 |