노션 수식 내 날짜/시간 처리 함수(dateBetween, dateAdd)의 시차 오차 해결법
노션 데이터베이스에서 날짜를 계산하다 보면 마감일까지 남은 일수가 예상보다 하루 적게 나오거나, dateAdd()로 계산한 시간이 9시간 차이 나는 문제가 발생할 수 있습니다.
이러한 현상은 대부분 함수 자체의 오류가 아닙니다. 날짜 속성에 저장된 시간, 워크스페이스의 시간대, 외부 API에서 전달된 UTC 값, dateBetween()의 계산 방식이 서로 다르기 때문에 발생합니다.
이번 글에서는 노션 날짜 수식에서 시차 오차가 생기는 원인과 안전하게 해결하는 방법을 실제 수식과 함께 알아보겠습니다.
dateBetween과 dateAdd 함수의 차이
노션 공식 문서에 따르면 dateBetween()은 두 날짜 사이의 차이를 숫자로 반환하고, dateAdd()는 기준 날짜에 지정한 기간을 더해 새로운 날짜를 반환합니다. 두 함수는 years, months, weeks, days, hours, minutes 단위를 지원합니다.
dateBetween 기본 구조
dateBetween(종료일, 시작일, "단위")
예를 들어 시작일과 종료일 사이의 날짜 차이를 계산하려면 다음과 같이 작성합니다.
dateBetween(prop("종료일"), prop("시작일"), "days")
종료일이 시작일보다 늦으면 양수가 나오고, 인수의 순서를 반대로 입력하면 음수가 나옵니다.
dateBetween(prop("시작일"), prop("종료일"), "days")
따라서 결과가 -3처럼 표시된다면 시차 문제라고 단정하기 전에 날짜의 입력 순서를 먼저 확인해야 합니다.
dateAdd 기본 구조
dateAdd(기준 날짜, 추가할 값, "단위")
시작일로부터 7일 뒤의 날짜를 구하는 수식은 다음과 같습니다.
dateAdd(prop("시작일"), 7, "days")
3시간 뒤를 계산하려면 단위를 hours로 변경합니다.
dateAdd(prop("시작일"), 3, "hours")
노션 Formula 2.0에서는 수식 결과가 텍스트뿐 아니라 날짜 형식으로도 반환되므로, 계산된 날짜를 다른 수식에서 다시 활용할 수 있습니다.
노션 날짜 수식에서 시차 오차가 생기는 이유
1. 날짜 속성에 시간이 포함된 경우
겉으로는 같은 날짜처럼 보여도 실제 저장된 시간이 다르면 dateBetween() 결과가 예상과 달라질 수 있습니다.
예를 들어 다음과 같이 입력했다고 가정해 보겠습니다.
- 시작일: 9월 10일 오후 11시
- 종료일: 9월 11일 오전 1시
달력상 날짜는 하루 차이지만 실제 경과 시간은 2시간입니다.
dateBetween(prop("종료일"), prop("시작일"), "days")
이 경우 완전한 하루가 지나지 않았기 때문에 결과가 0으로 표시될 수 있습니다. 이는 시차 오류가 아니라 days 단위로 계산되는 과정에서 발생한 결과입니다.
정확한 경과 시간을 먼저 확인하려면 다음 수식을 사용합니다.
dateBetween(prop("종료일"), prop("시작일"), "hours")
결과가 2라면 함수는 정상적으로 작동하고 있는 것입니다.
2. UTC와 한국 표준시가 혼용된 경우
한국 표준시인 KST는 UTC보다 9시간 빠릅니다. 외부 API나 자동화 도구에서 UTC 기준의 날짜를 노션으로 전달하면 한국에서 입력한 시간과 9시간 차이가 날 수 있습니다.
예를 들어 외부 데이터의 시간이 2026-09-22 00:00 UTC라면 한국에서는 2026-09-22 09:00 KST에 해당합니다. 밤 시간대의 UTC 값은 변환 과정에서 한국 날짜가 다음 날로 넘어갈 수도 있습니다.
다만 노션 화면에서 이미 현지 시간으로 정상 표시되는 값에 다시 9시간을 더하면 시간이 이중으로 보정됩니다. 따라서 무조건 dateAdd(..., 9, "hours")를 적용해서는 안 됩니다.
3. now()에 시각 정보가 포함된 경우
now()는 오늘 날짜만 반환하는 함수가 아니라 현재 날짜와 시각을 함께 반환합니다.
dateBetween(prop("마감일"), now(), "days")
마감일을 날짜만 지정했더라도 now()에는 현재 시각이 포함되어 있습니다. 이 때문에 사용자가 예상한 달력상의 일수와 실제 경과시간 기준의 결과가 다를 수 있습니다.
예를 들어 내일이 마감일이지만 현재 시각이 늦은 밤이라면 24시간이 채 남지 않아 결과가 0으로 표시될 수 있습니다.
4. 외부 서비스의 날짜 형식이 일정하지 않은 경우
Zapier, Make, Google Sheets 또는 자체 API를 통해 날짜를 가져오면 다음과 같이 서로 다른 형식이 사용될 수 있습니다.
2026-09-22
2026-09-22T09:00:00+09:00
2026-09-22T00:00:00Z
첫 번째 값은 시간대 정보가 없는 날짜이고, 두 번째 값에는 한국 표준시가 포함되어 있습니다. 세 번째 값 끝의 Z는 UTC 기준임을 의미합니다.
표시되는 날짜가 같아 보여도 내부 시간 정보가 다르므로 자동화 데이터를 사용할 때는 원본 값의 시간대부터 확인해야 합니다.
해결법 1. 시간 포함 여부부터 확인하기
오차가 발생했다면 날짜를 다음과 같이 표시해 실제 시간을 확인합니다.
formatDate(prop("시작일"), "YYYY-MM-DD HH:mm")
종료일도 같은 방식으로 확인합니다.
formatDate(prop("종료일"), "YYYY-MM-DD HH:mm")
날짜만 보던 화면에서 발견하지 못했던 오전 9시, 오후 11시 등의 시간 차이를 확인할 수 있습니다.
시간대 정보까지 점검하고 싶다면 다음처럼 표시할 수 있습니다.
formatDate(prop("시작일"), "YYYY-MM-DD HH:mm Z")
단, formatDate()의 결과는 날짜가 아닌 텍스트입니다. 표시 또는 점검용으로 사용하고, 이후 날짜 계산에는 원래 날짜 속성을 이용하는 것이 안전합니다.
해결법 2. 계산 단위를 hours로 먼저 검사하기
days 결과가 예상과 다르다면 hours 단위로 먼저 계산해 봅니다.
dateBetween(prop("종료일"), prop("시작일"), "hours")
결과가 23시간 또는 25시간처럼 나온다면 두 속성의 시각이나 시간대 설정이 서로 다를 가능성이 있습니다.
단순히 24시간을 하루로 환산하려면 다음 수식을 사용할 수 있습니다.
dateBetween(prop("종료일"), prop("시작일"), "hours") / 24
하지만 이 결과는 실제 경과시간을 기준으로 한 소수입니다. 달력에 표시된 날짜 수를 계산하려는 목적이라면 날짜 속성의 시간을 동일하게 입력하는 편이 더 안정적입니다.
해결법 3. UTC 데이터에만 9시간 보정하기
외부 시스템에서 UTC 값이 그대로 들어왔다는 사실이 확인됐다면 다음과 같이 KST 기준으로 보정할 수 있습니다.
dateAdd(prop("UTC 날짜"), 9, "hours")
보정한 날짜를 기준으로 차이를 계산하려면 다음처럼 작성합니다.
dateBetween(
prop("종료일"),
dateAdd(prop("UTC 날짜"), 9, "hours"),
"hours"
)
이 수식은 원본 값이 실제로 UTC일 때만 사용해야 합니다. 이미 +09:00이 포함됐거나 노션에서 한국 시간으로 변환된 값이라면 9시간을 추가하지 않습니다.
해결법 4. 빈 날짜 예외 처리하기
날짜 속성이 비어 있으면 수식 오류가 발생하거나 의도하지 않은 결과가 표시될 수 있습니다. 실무에서는 empty() 조건을 추가하는 것이 좋습니다.
if(
or(empty(prop("시작일")), empty(prop("종료일"))),
"",
dateBetween(prop("종료일"), prop("시작일"), "days")
)
시작일이나 종료일 중 하나라도 비어 있으면 빈 값을 표시하고, 두 날짜가 모두 입력됐을 때만 계산합니다.
이처럼 수식을 여러 단계로 나누어 입력값과 결과를 검사하는 방식은 노션 공식 가이드에서도 권장하는 접근법입니다.
해결법 5. 날짜 범위는 시작일과 종료일을 분리하기
하나의 날짜 속성에 기간을 설정했다면 dateStart()와 dateEnd()를 사용해야 합니다.
dateBetween(
dateEnd(prop("기간")),
dateStart(prop("기간")),
"days"
)
노션 공식 함수 예시에서도 날짜 범위의 시작과 끝을 각각 분리한 뒤 dateBetween()으로 차이를 계산합니다. 두 함수의 순서를 바꾸면 결과의 부호도 반대로 표시됩니다.
마감일까지 남은 날짜 계산 수식
가장 많이 사용하는 형태는 다음과 같습니다.
if(
empty(prop("마감일")),
"",
dateBetween(prop("마감일"), now(), "days")
)
마감일이 지났는지 함께 표시하려면 조건을 추가할 수 있습니다.
if(
empty(prop("마감일")),
"마감일 미입력",
if(
dateBetween(prop("마감일"), now(), "days") < 0,
"마감",
"D-" + format(dateBetween(prop("마감일"), now(), "days"))
)
)
당일 결과가 D-0으로 표시되는 것이 어색하다면 별도 조건을 추가합니다.
if(
empty(prop("마감일")),
"마감일 미입력",
lets(
남은날짜, dateBetween(prop("마감일"), now(), "days"),
if(
남은날짜 < 0,
"마감",
if(남은날짜 == 0, "오늘 마감", "D-" + format(남은날짜))
)
)
)
시차 문제가 생겼을 때 점검할 항목
노션 날짜 수식의 결과가 예상과 다르다면 다음 순서로 확인하는 것이 좋습니다.
dateBetween()의 종료일과 시작일 순서 확인- 날짜 속성의 시간 포함 옵션 확인
formatDate()로 실제 시각 표시days대신hours로 계산해 차이 확인- 외부 데이터가 UTC인지 KST인지 확인
- 이미 변환된 값에 9시간을 다시 더하지 않았는지 확인
- 날짜 범위라면
dateStart()와dateEnd()사용 - 빈 속성에 대한 예외 조건 추가
마무리
노션의 dateBetween()과 dateAdd()에서 발생하는 시차 오차는 대부분 날짜 속성에 포함된 시각과 외부 데이터의 시간대가 일치하지 않아 발생합니다.
오차가 보인다고 바로 9시간을 더하기보다는 formatDate()로 실제 저장 시간을 확인하고, hours 단위로 차이를 점검해야 합니다. UTC 데이터라는 사실이 명확할 때만 dateAdd(..., 9, "hours")를 적용해야 이중 보정을 막을 수 있습니다.
날짜 계산 수식은 입력값, 시간대, 계산 단위를 동일한 기준으로 관리하는 것이 가장 중요합니다.




댓글 0
첫 댓글을 남겨보세요.