Blog Archive

레이블이 수식인 게시물을 표시합니다. 모든 게시물 표시
레이블이 수식인 게시물을 표시합니다. 모든 게시물 표시

2023-09-29

Airtable 팁: 2024년 공휴일을 반영한 영업일 기준 전날, 다음날 계산식

에어테이블(Airtable)은 관계형 데이터베이스를 기반으로 매우 쉽고, 매우 강력한 노코드 앱 개발 환경을 제공합니다. 스프레드시트와 유사하지만, 훨씬 다재다능하며, 워크플로우(workflow), 자동화, 데이터 시각화나 비즈니스 인텔리전스(BI)를 쉽게 구축할 수 있으며, 데스크톱 또는 모바일 앱 또는 웹을 쉽게 만들 수도 있습니다. 앞으로 Airtable과 관련한 다양한 이야기와 팁을 하나씩 정리해보겠습니다.

두 날짜의 차이 판단하여 이름 붙이기

Airtable에서 {시작일}이라는 필드가 있다고 했을 때, 그 시작일이 현재를 기준으로 다음날인지, 전날인지, 아니면 이틀 후인지 등은 DATETIME_DIFF 함수를 통해 쉽게 파악할 수 있습니다.

SWITCH(     
	DATETIME_DIFF({시작일}, NOW(), 'days'), 
	2, '모레',
	1, '내일',
	0, '오늘',
	-1, '어제',
	-2, '그제' )
이런 식입니다. 그런데, 이 수식에는 몇 가지 문제가 있습니다. 

첫째, 시간대가 반영되지 않았습니다. 우리 나라는 표준 시간(UTC, Universal Time Coordinated)보다 9시간 빠르므로, 위와 같이 하면, 9시간의 오차가 계속 나게 됩니다. 즉, 필드 값이 어제 오후 3시가 넘어가면, 위의 수식에서는 그냥 '오늘'이라는 값을 리턴해버립니다.

둘째, 영업일(working days, business days)이 반영되지 않았습니다. 실제 Airtable을 비즈니스 현장에서 쓸 때에는 영업일을 기준으로 날짜 계산이 필요한 경우가 많습니다. 예를 들어, 예정 일정 하루 전에 반드시 (자동 또는 수동으로) 이메일/문자 알림을 보내거나, 고객에게 전화를 걸어야 하는 업무가 있다고 가정해보겠습니다. 다음 주 월요일이 교육 시작일인데, 오늘은 전주 금요일입니다. 그러면 오늘은 그냥 날짜 상으로는 3일 전이지만, 영업일 기준으로는 하루 전입니다. 그래서 오늘 반드시 고객에게 전화를 걸어야 합니다. 

2024년 9월 달력. 영업일 기준 다음날과 캘린더 기준 내일이 완전히 다른 경우
2024년 9월 달력. 영업일 기준 다음날과 캘린더 기준 내일이 완전히 다른 경우


    
영업일을 반영하려면, 주말인 토요일, 일요일을 일단 계산에서 제외해야 합니다. 그래도 문제가 있습니다. 주말은 아니지만, 공휴일, 소위 말하는 빨간 날을 제외해야 제대로 된 영업일 기준의 날짜 계산을 해줍니다. 그냥 수동으로 업무를 처리할 때에는, 그 정도는 사람이 감안해서 미리미리 처리해주면 되겠지만, 모든 것이 자동으로 처리되는 대량의 데이터 시스템에서는, 이런 계산을 대충 하게 되면 큰일 납니다.

시간대, 영업일을 고려한 날짜 차이 계산식

따라서 다음과 같이 보완을 해줍니다.

첫째, 시간대를 반영해서, Airtable 현재 시스템 시간에 DATEADD 함수를 이용해 9시간을 더합니다.
DATEADD(NOW(), 9, 'hours')
둘째, 구해진 시간을 한국 시간대로  설정해줍니다. SET_TIMEZONE 함수는 첫 번째 파라미터의 시간을 두 번째 파라미터에서 표시한 시간대로 표시해 시간값을 리턴해줍니다. 시간대별 표시자(identifier) 목록을 참고하십시오. (Airtable 필드 형식(Formatting) 설정에서 시간대를 바꿔주는 옵션이 있습니다만, 이것은 손대지 않는다고 가정합니다.) 추가로, 편의상 DATESTR 함수를 써서 일정 표시를 ISO 8601 날짜 표현방식에 따라, YYYY-MM-DD로 바꿔주겠습니다.

DATESTR(SET_TIMEZONE(DATEADD(NOW(), 9, 'hours'), 'Asia/Seoul'))


셋째, 이렇게 구한 현재 날짜/시간과 {시작일} 필드값을 비교해야 합니다. 그런데, 위에서 썼던 DATETIME_DIFF 함수를 쓰면, 주말이나 공휴일을 고려하지 않고, 날짜 차이를 계산합니다. 약간 주의할 점은, 시작일과 끝일을 모두 포함하여 계산하니, 양수인 경우 +1이, 음수인 경우 -1을 더한 값이 나옵니다.WORKDAY_DIFF라는 영업일 계산 함수를 써서, 일단 주말을 고려하여 날짜 차이를 계산합니다.

WORKDAY_DIFF(
  	DATESTR(SET_TIMEZONE(DATEADD(NOW(), 9, 'hours'), 'Asia/Seoul')),
    {시작일}
)

이렇게 하면, 시작일에서 현재일 사이에 영업일이 며칠 있는지 계산해줍니다. 그 값이 마이너스이면, 시작일이 이미 지났다는 뜻이고, 양수이면 시작일이 미래라는 뜻입니다. 결과가 0이면 영업일이 하나도 없으니, 시작일과 현재일이 모두 휴일이라는 뜻입니다. 1 또는 -1이면 시작일이나 현재일 둘 중의 하나가 영업일이라는 뜻입니다.

넷째, WORKDAY_DIFF 함수에서 세 번째 파라미터에 주말이 아닌 공휴일을 추가합니다. 2024년 기준 대한민국 공휴일을 참조하여, 마지막으로 공휴일 목록을 하나의 문자열로 묶어서 넣습니다. 

WORKDAY_DIFF(
	DATESTR(SET_TIMEZONE(DATEADD(NOW(), 9, 'hours'), 'Asia/Seoul')),
    {시작일}, 
    '2023-01-23, 2023-01-24, 2023-03-01, 2023-05-05, 2023-06-06, 2023-08-15, 2023-09-28, 2023-09-29, 2023-10-02, 2023-10-03, 2023-10-09, 2023-12-25, 2024-01-01, 2024-02-09, 2024-03-01, 2024-05-15, 2024-06-06, 2024-08-15, 2024-09-16, 2024-09-17, 2024-09-18, 2024-10-03, 2024-10-09, 2024-12-25'
)

다섯째, 다시 SWITCH 조건문에서 위의 값을 검사하여, 전전날, 전날, 오늘, 다음날, 담담날을 표시해주도록 합니다.

SWITCH(
	WORKDAY_DIFF(DATESTR(SET_TIMEZONE(DATEADD(NOW(), 9, 'hours'), 'Asia/Seoul')), {시작일}, '2023-01-23, 2023-01-24, 2023-03-01, 2023-05-05, 2023-06-06, 2023-08-15, 2023-09-28, 2023-09-29, 2023-10-02, 2023-10-03, 2023-10-09, 2023-12-25, 2024-01-01, 2024-02-09, 2024-03-01, 2024-05-15, 2024-06-06, 2024-08-15, 2024-09-16, 2024-09-17, 2024-09-18, 2024-10-03, 2024-10-09, 2024-12-25'),
	-3,'전전날',
	-2,'전날',
    -1,'(지난)오늘',
    0, '휴일',
	1,'(올)오늘',
	2,'다음날',
	3,'담담날'
)

실제 베이스 예시: 행사 운영 관리


아래에 예시로 만들어놓은 '행사운영관리'라는 베이스를 살펴보십시오. {시작일}이 오늘인지, 전날인지, 다음 날인지 판단하여 {영업일 기준}이라는 필드에서 결과를 보여줍니다. 시작일 하루 전에는 '사전 안내'를 반드시 해야 하고, 당일은 '현장 진행'을 해야 하고, 하루가 지나면 '해피콜'을 반드시 해야 한다고 합시다. 그런 업무를 체크리스트로 만들어놓고, 전날 일정, 오늘 일정, 다음날 일정 등만 따로 볼 수 있는 뷰(View)를 만들어놓으면, 누락이 없는 업무 관리 시스템이 됩니다. 또 거기에 전날, 오늘, 다음날 해야 하는 일들을 자동화(automation)로 걸어놓으면, 업무 담당자의 반복적인 업무가 획기적으로 줄어들겠죠? 이런 이야기는 다음 기회에...