AI 해결 노트 · 2026-09-18 · 실측 2026-09-18
같은 날짜인데 비교가 안 맞을 때 — 숨은 시간과 표시 형식
한 줄로
화면에 똑같이 2026-09-18 이라고 찍힌 두 칸을 =B2=B3 으로 맞대면 FALSE가 나옵니다. 한쪽에 오후 2시 30분이 붙어 있어서 셀이 든 값은 46283.604166666664 와 46283 이기 때문입니다. 글자로 들어간 날짜, 숫자로 보이는 날짜까지 네 가지를 한 칸씩 넣어 Value2와 표시 형식을 읽어 봤고, INT·DATEVALUE·*1 로 맞추니 전부 TRUE가 됐습니다. 같은 값을 정렬·필터에 걸었더니 필터는 3건, COUNTIF 는 2건을 세면서 서로 다른 줄을 잡았습니다.
증상
- 눈으로 봐서는 같은 날짜인데 두 칸을
=로 맞댄 결과가 FALSE입니다. - 날짜로 조건을 걸어 세면 실제보다 적게 나옵니다.
- 오름차순 정렬을 걸었는데 9월 5일이 9월 20일 뒤로 갑니다.
- 필터로 「9월 18일」만 골랐을 때 보이는 줄 수와, 수식으로 센 건수가 다릅니다.
실측 환경
| 항목 | 값 |
|---|---|
| OS | Windows 11 Home (10.0.26200) |
| Excel | 16.0 (빌드 20326), UI 언어 1042(한국어) |
| 조작 방법 | Excel COM (Excel.Application, Visible=false)로 셀에 값·수식을 넣고 Text·Value2·NumberFormatLocal 을 읽음. 정렬은 ws.Sort 개체, 필터는 Range.AutoFilter |
| 시험 파일 | 직접 만든 더미 X2_43_날짜비교.xlsx (거래처 이름은 가나상사·다라물산처럼 지어낸 값) |
| 로그 | 원자료\excel-date-hidden-time\01_비교_실행로그.txt 외 3건 (02~04). 환경 값은 04_실패재현_로그.txt 의 [0], 정렬·필터 호출은 같은 로그 [5] 에 있습니다 |
이번 시험에서 엑셀 창을 띄워 메뉴를 눌러 본 것은 아닙니다. 같은 일을 하는 명령을 COM으로 부르고 그 결과 숫자를 읽었습니다. 화면 이름이 쓰시는 판과 다를 수 있습니다.
같은 날로 보이는 네 칸
한 열에 네 가지를 넣었습니다. 시간이 붙은 날짜, 순수 날짜, 글자로 넣고 표시 형식만 날짜로 바꾼 칸, 표시 형식을 「일반」으로 둔 날짜입니다.

| 셀 | 셀에 든 것 | 화면 | =이 칸=B3 | Value2 | ISTEXT |
|---|---|---|---|---|---|
| B2 | 2026-09-18 14:30 | 2026-09-18 | FALSE | 46283.604166666664 | FALSE |
| B3 | 2026-09-18 | 2026-09-18 | TRUE | 46283 | FALSE |
| B4 | '2026-09-18 (글자) | 2026-09-18 | FALSE | "2026-09-18" | TRUE |
| B5 | 2026-09-18, 형식 일반 | 46283 | TRUE | 46283 | FALSE |
아래에서 B2·B3·B4·B5는 계속 이 네 칸을 가리킵니다. B2와 B3은 화면 글자가 한 자도 다르지 않은데 비교가 FALSE입니다. B4는 표시 형식을 yyyy-mm-dd 로 바꿔 놨는데도 속은 글자 그대로입니다. B5는 값이 B3과 똑같은데 형식이 일반이라 다섯 자리 숫자로 보입니다.
엑셀은 날짜를 일련번호로 갖고 있습니다. 1899-12-30을 0으로 잡고 센 값이고, 이번 시험에서 2026-09-18은 46283이었습니다. 46283이 든 B3에 =TEXT(B3,"yyyy-mm-dd hh:mm:ss") 를 걸면 2026-09-18 00:00:00 이 돌아옵니다. 하루가 1이니 오후 2시 30분은 14.5시간 ÷ 24 = 0.604166... 이 소수점 아래에 붙습니다. yyyy-mm-dd 표시 형식은 소수점 아래를 화면에 안 보여 줄 뿐 지우지는 않습니다.
시간까지 펴 보면 이렇게 나옵니다.
=TEXT(B2,"yyyy-mm-dd hh:mm:ss") -> 2026-09-18 14:30:00
=TEXT(B3,"yyyy-mm-dd hh:mm:ss") -> 2026-09-18 00:00:00
=B2-B3 -> 0.6041666666642413두 칸을 빼 보면 무엇이 다른지가 숫자로 나옵니다. 0이 아니면 두 값이 같지 않다는 뜻이고, 차이가 1보다 작으면 날짜는 같고 소수점 아래만 다르다는 뜻입니다. B2와 B3의 차이 0.6041666666642413은 시간 차이입니다. 차이가 1 이상이면 날짜 자체가 다른 것이니, 위처럼 hh:mm:ss 까지 펴서 양쪽을 나란히 보시는 편이 확실합니다.
표시 형식을 바꿔도 글자는 글자입니다
글자로 넣은 B4를 갖고 형식만 이리저리 바꿔 봤습니다.
바꾸기 전 Value2='2026-09-18' 표시 형식 yyyy-mm-dd ISTEXT=TRUE
일반으로 Value2='2026-09-18' 화면 2026-09-18 ISTEXT=TRUE
날짜로 Value2='2026-09-18' 화면 2026-09-18 ISTEXT=TRUE
다시 입력 Value2=46283 화면 2026-09-18 ISTEXT=FALSE표시 형식은 화면에 어떻게 보일지를 정하는 것이라 셀 안의 글자를 건드리지 않습니다. 마지막 줄의 「다시 입력」은 그 칸에 들어 있던 글자를 같은 자리에 그대로 다시 써 넣은 것입니다. 그때 비로소 46283이 됐습니다. 값을 새로 입력받는 순간에 엑셀이 날짜로 읽어 들인다는 뜻입니다. 열 전체를 한꺼번에 바꾸는 절차는 이번 시험에서 돌려 보지 않았습니다. 데이터 탭의 텍스트 나누기로 점 찍은 날짜까지 한 번에 바꾼 기록은 엑셀 표 정리 순서 에 있습니다.
이런 칸이 열에 몇 개나 있는지는 =SUMPRODUCT(--ISTEXT(범위)) 로 셉니다. 날짜인지까지 가려 주지는 않고 글자인 칸을 세는 것이라, 날짜만 적어 둔 열에서 이 숫자가 0이 아니면 그만큼이 글자로 들어와 있다는 뜻입니다.
맞추는 법 네 가지

| 문제 | 쓴 수식 | 결과 |
|---|---|---|
| 시간이 붙어 있다 | =INT(B2)=B3 | TRUE |
| 시간이 붙어 있다 | =TRUNC(B2)=B3 | TRUE |
| 시간이 붙어 있다 | =B2-B3 | 0.604166667 |
| 글자로 들어 있다 | =DATEVALUE(B4)=B3 | TRUE |
| 글자로 들어 있다 | =B4*1=B3 | TRUE |
| 열 전체를 세야 한다 | =SUMPRODUCT(--(INT(정렬!B2:B8)=DATE(2026,9,18))) | 3 |
마지막 줄의 정렬!B2:B8 은 다음 절에 나오는 접수일 일곱 줄입니다.
INT 는 소수점 아래를 버립니다. 날짜 일련번호에서 소수점 아래가 곧 시간이니, INT 를 씌우면 자정으로 내려앉습니다. TRUNC 도 같은 결과였습니다.
=INT(46283.604166666664) -> 46283
=TRUNC(46283.604166666664) -> 46283
=INT(-1.5) -> -2
=TRUNC(-1.5) -> -1둘이 갈리는 곳은 음수입니다. INT 는 작은 쪽으로 내리고 TRUNC 는 0 쪽으로 자릅니다. 이번에 넣어 본 날짜 일련번호는 모두 양수였고, 그 범위에서는 두 함수가 같은 값을 돌려줬습니다.
DATEVALUE 는 글자를 일련번호로 바꿔 줍니다. 다만 받아 주는 표기가 정해져 있어서 일곱 가지를 넣어 봤습니다.
| 셀에 든 글자 | DATEVALUE | TIMEVALUE | *1 |
|---|---|---|---|
2026-09-18 | 2026-09-18 | 00:00 | 46283 |
2026-09-18 14:30 | 2026-09-18 | 14:30 | 46283.604166666664 |
2026.09.18 | 오류 | 오류 | 오류 |
2026/09/18 | 2026-09-18 | 00:00 | 46283 |
2026년 9월 18일 | 2026-09-18 | 00:00 | 46283 |
18-Sep-2026 | 2026-09-18 | 00:00 | 46283 |
20260918 | 오류 | 오류 | 20260918 |
점으로 찍은 2026.09.18 은 오류였습니다. 시간이 붙은 글자를 넘기면 DATEVALUE 가 날짜만 떼어 오므로, 글자 상태에서는 이 함수 하나로 시간까지 같이 잘립니다. 맨 아래 20260918 은 조심하셔야 합니다. DATEVALUE 는 오류를 내지만 *1 은 이천만이 넘는 숫자를 그냥 돌려줍니다. 날짜로 바뀐 줄 알고 넘어가기 쉬운 자리입니다.
화면 글자끼리 맞대는 방법도 있습니다.
=TEXT(B2,"yyyy-mm-dd")=TEXT(B3,"yyyy-mm-dd") -> TRUE
=TEXT(B4,"yyyy-mm-dd")=TEXT(B3,"yyyy-mm-dd") -> TRUETEXT 로 양쪽을 같은 모양의 글자로 만들어 놓고 맞대는 것입니다. 시간이 붙은 B2와 글자로 든 B4를 이렇게 비교했더니 둘 다 TRUE가 나왔습니다. 다만 TEXT 가 돌려주는 값은 글자입니다. 그 열을 그대로 두고 날짜 계산을 이어 붙이면 위 DATEVALUE 표에서 본 문제를 다시 만나게 되니, 표에 남겨 계속 쓸 열이면 INT 쪽이 낫습니다. 한 번 보고 말 확인이면 TEXT 가 편합니다.
정렬에서 벌어지는 일
거래처 일곱 곳의 접수일을 넣었습니다. 네 칸은 진짜 날짜, 세 칸은 글자입니다. 글자 세 칸도 표시 형식을 yyyy-mm-dd 로 맞춰 놔서 화면으로는 구분이 안 됩니다.

| 정렬 뒤 차례 | 거래처 | 화면 | 셀이 든 값 |
|---|---|---|---|
| 1 | 다라물산 | 2026-09-17 | 46282 |
| 2 | 카타상회 | 2026-09-18 | 46283 |
| 3 | 가나상사 | 2026-09-18 | 46283.604166666664 |
| 4 | 사아산업 | 2026-09-20 | 46285 |
| 5 | 마바기업 | 2026-09-05 | 글자 2026-09-05 |
| 6 | 타파상사 | 2026-09-18 | 글자 2026-09-18 |
| 7 | 자차테크 | 2026-09-30 | 글자 2026-09-30 |
글자 세 칸이 값과 상관없이 끝으로 몰렸습니다. 오름차순에서 숫자가 먼저 서고 글자가 뒤에 서기 때문에, 9월 5일이 9월 20일 아래로 내려갑니다. 여기서는 표시 형식까지 날짜로 맞춰 놔서 화면만 보고는 왜 이렇게 섰는지 알 수 없습니다.
2·3번 줄도 봐 두실 만합니다. 둘 다 화면은 9월 18일인데 값이 46283(0시)인 카타상회가 앞, 46283.604166666664(오후 2시 30분)인 가나상사가 뒤로 섰습니다. 같은 날 안에서 차례가 뒤바뀌는 것처럼 보이는 일이 여기서 생깁니다.
필터와 수식이 서로 다른 답을 냅니다
같은 일곱 줄에 「접수일이 2026-09-18」 조건을 걸었습니다. 자동 필터에 Criteria1:="2026-09-18" 을 넘긴 결과와, 수식으로 센 결과입니다.
| 센 방법 | 건수 | 잡힌 줄 |
|---|---|---|
자동 필터 Criteria1:="2026-09-18" | 3 | 카타상회 · 가나상사 · 타파상사 |
=COUNTIF(B2:B8,DATE(2026,9,18)) | 2 | 카타상회 · 타파상사 |
=COUNTIFS(B2:B8,">="&DATE(2026,9,18),B2:B8,"<"&DATE(2026,9,19)) | 2 | 카타상회 · 가나상사 |
=SUMPRODUCT(--(INT(B2:B8)=DATE(2026,9,18))) | 3 | 카타상회 · 가나상사 · 타파상사 |
한 줄씩 떼어 재 보니 갈리는 자리가 분명했습니다. COUNTIF 는 글자로 된 타파상사를 세면서 시간이 붙은 가나상사를 빠뜨렸고, ">="&DATE 는 가나상사를 세면서 타파상사를 빠뜨렸습니다. 가운데 두 줄은 건수가 똑같이 2인데 센 줄이 다릅니다. 숫자만 맞춰 보고 넘어가면 못 잡습니다.
필터로 3건을 보고 보고서에 「9월 18일 접수 3건」이라고 적었는데 옆자리에서 COUNTIF 로 2건을 뽑아 오면, 둘 중 누가 틀린 것이 아니라 열 안에 형태가 섞여 있는 것입니다. 이 일곱 줄에서는 =SUMPRODUCT(--(INT(B2:B8)=DATE(2026,9,18))) 가 글자로 든 줄과 시간이 붙은 줄을 함께 세어 3으로 모았습니다.
결과
| 센 것 | 값 |
|---|---|
| 접수일 칸 수 | 7 |
| 숫자(날짜)로 들어 있는 칸 | 4 |
| 글자로 들어 있는 칸 | 3 |
| 필터로 고른 9월 18일 | 3건 |
COUNTIF 로 센 9월 18일 | 2건 |
INT 로 자르고 센 9월 18일 | 3건 |
열을 받자마자 =SUMPRODUCT(--ISTEXT(범위)) 와 =SUMPRODUCT(--ISNUMBER(범위)) 를 한 번씩 찍어 보십시오. 둘 다 0보다 크면 한 열에 글자와 숫자가 섞여 있다는 뜻입니다. 이 표에서는 3과 4가 나왔습니다.
실패한 것
- 「일반」 표시 형식을 주려고
Range.NumberFormat = "General"을 넣었더니 막혔습니다.NumberFormatLocal = "G/표준"으로 바꾸니 통과했고, 같은 자리에서NumberFormat = "@"(텍스트)는 영어 이름 그대로 됐습니다. 네 가지를 다시 일으켜04_실패재현_로그.txt에 남겼습니다.
---- ws.Range("A1").NumberFormat = "General"
결과: 실패
(-2147352567, '예외가 발생했습니다.', (0, 'Microsoft Excel',
'Range 클래스 중 NumberFormat 속성을 설정할 수 없습니다.', 'xlmain11.chm', 0, -2146827284), None)
---- ws.Range("A1").NumberFormatLocal = "G/표준" 결과: 성공 -> 'G/표준'
---- ws.Range("A2").NumberFormat = "@" 결과: 성공 -> '@'- 파이썬
datetime을 셀에 그대로 넣었더니 아홉 시간(0.375일)만큼 밀려 들어갔습니다. 일련번호를 직접 계산해Value2로 넣어 고쳤습니다.
넣은 값 2026-09-18 14:30 -> 셀 Text='2026-09-18 05:30:00' Value2=46283.229166666664
직접 계산한 값 = 46283.604166666664 차이 = -0.375
넣은 값 2026-09-18 00:00 -> 셀 Text='2026-09-17 15:00:00' Value2=46282.625
직접 계산한 값 = 46283.0 차이 = -0.375
Value2 로 넣었을 때 -> 셀 Text='2026-09-18 14:30:00' Value2=46283.604166666664- 열 전체를 한 번에 세려고
=SUMPRODUCT(--(INT(N(B2:B8))=DATE(2026,9,18)))를 넣었더니 0이 나왔습니다.=N(B2:B8)만 따로 찍어 보니 46282, 범위의 첫 값 하나만 돌아옵니다.N을 빼고INT를 바로 씌우니 3이 됐습니다. - 표 머리글에
=?=순수날짜라고 적었다가 COM 오류를 봤습니다.=로 시작하는 글자를 엑셀이 수식으로 읽습니다. 머리글 문구를 「순수 날짜와 같은가」로 바꾸니 통과했습니다(04_실패재현_로그.txt[3]). - 그림에 쓸 표에서 실제 값을 글자로 적어 뒀더니 엑셀이 그것을 다시 읽었습니다.
'46283.604166666664'를 넣은 칸은46283.6으로 줄어 보였고,'2026-09-18'을 넣은 칸은 앞따옴표를 텍스트 접두로 삼켜2026-09-18'이 됐습니다. 그 칸의 표시 형식을@로 먼저 두고 다시 만드니 넣은 글자가 그대로 남았습니다.
확인하지 않은 것
- 엑셀 창을 띄워 메뉴를 눌러 보지 않았습니다. 필터는
Range.AutoFilter에 조건을 넘긴 것이고, 날짜 필터 드롭다운이 연·월·일로 접히는 목록에서 시간 붙은 값을 어디에 넣는지는 확인하지 못했습니다. - 통합 문서 옵션의 1904 날짜 체계에서도 같은 일련번호가 나오는지 바꿔 보지 않았습니다.
- 두 자리 연도(
26-09-18)를 어느 세기로 읽는지 넣어 보지 않았습니다. - 영문 Windows처럼 지역 설정이 다른 PC에서
DATEVALUE가 같은 일곱 가지 글자를 똑같이 받아 주는지 확인하지 않았습니다. 위 표는 UI 언어 1042, 국가 설정 82로 읽힌 PC 한 대에서만 잰 값입니다. 2026-09-18T14:30:00같은 ISO 표기나 시간대가 붙은 글자는 넣어 보지 않았습니다.- 피벗 테이블에서 시간이 붙은 날짜가 어느 날짜 그룹으로 묶이는지 만들어 보지 않았습니다.
- 줄이 수만 개일 때
SUMPRODUCT가 얼마나 걸리는지 재지 않았습니다. 일곱 줄로만 했습니다. - 자동 필터를 인수 없이
Range.AutoFilter()로 불러 해제하려던 것은Range 클래스 중 AutoFilter 메서드에 오류가 있습니다로 막혀서,ws.AutoFilterMode = False로 껐습니다. 화면에서 필터 단추를 다시 누르는 것과 같은 동작인지는 확인하지 않았습니다.