/* * eventTime 이 **날짜 컬럼**이라는 사실을 지킨다. * * ── 왜 있나 (2026-08-08) ──────────────────────────────────────────────────── * 예전에는 문자열 컬럼이었고, "UTC ISO 만 들어오니 사전식 비교가 맞는다" 는 전제 위에서 정렬·범위 * 질의가 돌았다. 그 전제는 컬럼 어디에도 적혀 있지 않았다. * * 날짜 컬럼으로 바꾸면서 **들어온 것이 없는 함정**이 하나 드러났다: sqlite 는 datetime 을 공백 구분 형식 * (`2026-08-07 11:00:00.000`)으로 저장하는데, 화면은 ISO 문자열(`…T11:00:00.000Z`)을 보낸다. * 문자열 그대로 비교하면 사전식으로 어긋나 **오류 없이 0건**이 나온다 — 원장 시간창이 알리지 않고 * 비어 버리고, 사용자는 "그 시간에 아무 일도 없었다" 로 읽는다. * * 그래서 두 가지를 못 박는다: 저장 형식이 실제로 그렇다는 것과, 경계에서 날짜로 옮기면 걸린다는 것. * 이 검사가 깨지면 typeorm/드라이버의 거동이 바뀐 것이므로 변환 지점을 다시 봐야 한다. */ import { test } from 'node:test' import assert from 'node:assert/strict' import { createRequire } from 'node:module' const req = createRequire(import.meta.url) const { DataSource, EntitySchema, Between } = req('typeorm') const Ev = new EntitySchema({ name: 'ev', tableName: 'ev', columns: { id: { primary: true, type: 'int', generated: true }, eventTime: { type: 'datetime', nullable: true } } }) async function seeded() { const ds = new DataSource({ type: 'sqlite', database: ':memory:', entities: [Ev], synchronize: true }) await ds.initialize() const repo = ds.getRepository('ev') await repo.save([ { eventTime: new Date('2026-08-07T11:00:00.000Z') }, { eventTime: new Date('2026-08-07T13:00:00.000Z') } ]) return { ds, repo } } test('sqlite 는 datetime 을 공백 구분 형식으로 저장한다 — ISO 문자열과 사전식으로 어긋난다', async () => { const { ds } = await seeded() const raw = await ds.query('select eventTime from ev order by id') assert.match(raw[0].eventTime, /^\d{4}-\d{2}-\d{2} /, '공백 구분이 아니면 이 검사의 전제가 바뀐 것이다') assert.ok(!String(raw[0].eventTime).includes('T'), 'T 가 들어가면 ISO 와 같은 형식이므로 함정이 사라진 것이다') await ds.destroy() }) test('ISO 문자열을 그대로 넘기면 **알리지 않고 0건** — 오류가 아니라 빈 결과라 더 위험하다', async () => { const { ds, repo } = await seeded() const rows = await repo.find({ where: { eventTime: Between('2026-08-07T10:00:00.000Z', '2026-08-07T12:00:00.000Z') } }) assert.equal(rows.length, 0, '이 검사가 깨졌다면 드라이버가 문자열을 받아 주게 된 것 — 변환 지점을 재검토할 것') await ds.destroy() }) test('경계에서 날짜로 옮기면 제대로 걸린다 — 질의 전에 반드시 변환한다', async () => { const { ds, repo } = await seeded() const rows = await repo.find({ where: { eventTime: Between(new Date('2026-08-07T10:00:00.000Z'), new Date('2026-08-07T12:00:00.000Z')) } }) assert.equal(rows.length, 1) await ds.destroy() })