[MINOR] Duplicate date detectie gebruikt LIKE string matching #13

Open
opened 2026-08-05 21:11:39 +02:00 by eddy · 0 comments
Owner

Probleem

src/database/db.ts:86-93:

export async function getMeasurementByDate(date: string): Promise<Measurement | null> {
  const db = await initDatabase();
  const day = date.substring(0, 10);
  return db.getFirstAsync<Measurement>(
    'SELECT * FROM measurements WHERE measuredAt LIKE ? AND deletedAt IS NULL LIMIT 1',
    [`${day}%`]
  );
}

Dit gebruikt string matching (LIKE '2024-01-15%') om metingen op dezelfde dag te vinden. Dit werkt voor ISO 8601 datums, maar is fragiel:

  • Als het datumformaat ooit verandert (bijv. met tijdzone offset), breekt de match stilletjes
  • LIKE zonder index is een full table scan

Oplossing

Gebruik SQLite's date() functie voor semantische datumvergelijking:

export async function getMeasurementByDate(date: string): Promise<Measurement | null> {
  const db = await initDatabase();
  return db.getFirstAsync<Measurement>(
    `SELECT * FROM measurements
     WHERE date(measuredAt) = date(?)
     AND deletedAt IS NULL
     LIMIT 1`,
    [date]
  );
}

Dit is robuuster omdat date() de datum extraheert ongeacht het tijdformaat.

## Probleem `src/database/db.ts:86-93`: ```ts export async function getMeasurementByDate(date: string): Promise<Measurement | null> { const db = await initDatabase(); const day = date.substring(0, 10); return db.getFirstAsync<Measurement>( 'SELECT * FROM measurements WHERE measuredAt LIKE ? AND deletedAt IS NULL LIMIT 1', [`${day}%`] ); } ``` Dit gebruikt string matching (`LIKE '2024-01-15%'`) om metingen op dezelfde dag te vinden. Dit werkt voor ISO 8601 datums, maar is fragiel: - Als het datumformaat ooit verandert (bijv. met tijdzone offset), breekt de match stilletjes - `LIKE` zonder index is een full table scan ## Oplossing Gebruik SQLite's `date()` functie voor semantische datumvergelijking: ```ts export async function getMeasurementByDate(date: string): Promise<Measurement | null> { const db = await initDatabase(); return db.getFirstAsync<Measurement>( `SELECT * FROM measurements WHERE date(measuredAt) = date(?) AND deletedAt IS NULL LIMIT 1`, [date] ); } ``` Dit is robuuster omdat `date()` de datum extraheert ongeacht het tijdformaat.
Sign in to join this conversation.
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
eddy/weegschaal-app#13
No description provided.