ํ•œ๊ตญ์ „๋ ฅ์˜ ์ „๊ธฐ์š”๊ธˆ์€ ๊ฒ€์นจ์ผ ๊ธฐ์ค€์œผ๋กœ ์›” ์ฒญ๊ตฌ์š”๊ธˆ์ด ๊ณ„์‚ฐ๋œ๋‹ค๊ณ  ํ•œ๋‹ค. ๋งŒ์•ฝ, ์ผ๋ณ„ ์š”๊ธˆ ์ •๋ณด๊ฐ€ ์กด์žฌํ•  ๋•Œ ๋น ์ ธ์žˆ๋Š” ์ผ์ž๋ฅผ ์ฑ„์šฐ๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ๊นŒ?
์ž๋ฐ” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค SQL, ๊ทธ๋ฆฌ๊ณ  ์‹œ๊ณ„์—ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ธฐ์ค€์—์„œ ์•Œ์•„๋ณด๋„๋ก ํ•˜์ž.

์ž๋ฐ” ์ฝ”๋“œ์—์„œ ๋น ์ง„ ๋‚ ์งœ๋ฅผ ์ฑ„์šฐ๊ธฐ

List<Billing> billingList = new ArrayList<>();
billingList.add(Billing.of(LocalDate.parse("2025-07-10")).setBill(0).calVat());
billingList.add(Billing.of(LocalDate.parse("2025-07-11")).setBill(50).calVat());
billingList.add(Billing.of(LocalDate.parse("2025-07-12")).setBill(25).calVat());

LocalDate startDate = LocalDate.parse("2025-07-10");
LocalDate endDate = LocalDate.parse("2025-08-09");

Set<LocalDate> billDates = billingList.stream().map(Billing::getBillDate).collect(Collectors.toSet());
Set<LocalDate> dates = startDate.datesUntil(endDate.plusDays(1L)).collect(Collectors.toSet());
for (LocalDate date : dates) {
    if (!billDates.contains(date)) {
        billingList.add(Billing.of(date));
    }
}

PostgreSQL์—์„œ ๋น ์ง„ ๋‚ ์งœ๋ฅผ ์ฑ„์šฐ๊ธฐ

SELECT 
  d::date AS bill_date,
  COALESCE(s.bill, 0) AS bill,
  COALESCE(s.vat, 0) AS vat
FROM 
  generate_series('2025-07-10'::date, '2025-08-09'::date, '1 day') d
LEFT JOIN 
  billing s ON s.bill_date = d::date
ORDER BY 
  d;

KDB+ ์‹œ๊ณ„์—ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๋น ์ง„ ๋‚ ์งœ๋ฅผ ์ฑ„์šฐ๊ธฐ

n:11;
dates: ([] bill_date: {x +til y-x}[2025.07.10;2025.08.09]);
billing: `bill_date xkey ([] bill_date: n?dates`bill_date; bill: n?100; vat: n?0.0f);
result: update bill:0^bill, vat:0^vat from dates lj billing;

๊ทธ๋Ÿฐ๋ฐ, ๋งŒ์•ฝ ์ผ๋ณ„ ์š”๊ธˆ ์ •๋ณด๊ฐ€ ๋‹ค์ˆ˜์˜ ๊ณ ๊ฐ๋“ค์ด ํ•จ๊ป˜ ํฌํ•จ๋œ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ•˜์ง€???