CompareSG

How old is your HDB block?

Pick your town to see its oldest blocks, and how old the rest are, from HDB’s own property file.

27 HDB towns, A to Z

Which blocks are the oldest in my town?

Each square is one residential block, oldest first, reading left to right then down. Colour shows the decade it was completed. The squares with a dot in the middle share the town’s oldest year. Hover, tap or use the arrow keys to see a block.

Which streets have the oldest blocks?

Each row is one street in your town, oldest first. The squares are its blocks in order of age, in the same colours. Hover or tap a square.

How old is a typical block in my town?

Each bar is a town’s middle block: half its blocks are older, half newer. A longer bar means an older typical block. Your town is in red. Towns with fewer than 100 blocks are listed at the bottom and not ranked. Click a bar to pick that town.

Which decade built my town?

Each circle is sized by the share of your town’s blocks completed in that decade. The line under it gives Singapore’s share, so you can compare like with like.

How old is my block?

Choose a street and block number in your town, or click a square above.

Fun finds

The short version

Only 95 of 10,796 HDB blocks (about 1 in 114) were completed before 1960, and the oldest year in HDB’s file is 1937, in Bukit Merah, but by typical block, Queenstown (1975) comes before Bukit Merah (1977).

What we did. We took every building in HDB’s Property Information file (13,357 rows) and kept the 10,796 with homes in them. For each of HDB’s 27 towns we found the oldest year, the blocks that share it, the typical (middle) year and the share built before 1980.

What we found. Bukit Merah holds the oldest year, 1937, with 20 blocks. But by typical block, 1 town has an older one: Queenstown (1975), then Bukit Merah (1977). The middle block in Singapore was completed in 1992. Only 1 town, Yishun, has a single oldest block. Towns with fewer than 100 blocks are shown, not ranked.

What to keep in mind. The file gives a year, not a date, so ties are common and we show each town’s oldest group. We do not know whether a block was rebuilt, renamed or renumbered, and 56 blocks are dated 2026. Older does not mean better or worse. Use the picker, then check the numbers and the boring bit below.

By Ben (opens in a new tab). Updated . Data: HDB, HDB Property Information, data.gov.sg.

Questions people ask

What is the oldest HDB block in Singapore?

In HDB's property file, the oldest year for a block with homes is 1937. 20 blocks share it, all in Bukit Merah, on 9 streets. The most are on Tiong Poh Road (6) and Eng Hoon Street (3). The file gives a year, not a date, so it cannot name one single oldest block.

Which HDB town has the oldest blocks?

It depends how you ask. Bukit Merah has the oldest year (1937), but among towns with at least 100 blocks, Queenstown has the oldest typical block, from 1975, followed by Bukit Merah (1977). Bukit Timah (27), Marine Parade (59), Central Area (79) have fewer than 100 blocks, so we show them but do not rank them.

How old is the typical HDB block?

The middle block of the 10,796 in HDB's file was completed in 1992, which is 34 years ago. 380 blocks (4%) date from before 1970 and 1,650 (15%) from before 1980.

How can I check how old my HDB block is?

Pick your town at the top of the page, then use “How old is my block?” to choose your street and block number. It shows the year completed in HDB's file, the number of homes and floors, and how many blocks in your town and in Singapore are older. The file has no lease start date, so a remaining-lease figure from another source can differ.

Which HDB town has the newest blocks?

Tengah. Its oldest block was completed in 2023 and its typical block in 2024.

Why do so many blocks share the oldest year?

HDB's file records the year, not the day. In 17 of 27 towns, 5 or more blocks share the oldest year, and only 1 town, Yishun, has a single oldest block (101 Yishun Avenue 5, 1977). So the page shows each town's oldest group, not one winner.

Are the oldest blocks still standing?

We checked all 335 blocks in the towns' oldest groups. Each has a street address in OneMap and a building outline in HDB's Existing Building file of Nov 2025 (335 of 335). That shows an address and a building outline exist there, not that the building is the original one.

Why does one street show blocks from different years?

The file gives every block its own year. On Balam Road, blocks 19 to 24 are dated 1965 and blocks 27 to 29 are dated 1995. We show each year as the file gives it and do not say why they differ.

What counts as an HDB block here?

A building with homes in it: 10,796 of the 13,357 buildings in HDB's file, in 27 HDB towns. The other 2,561 have no homes (for example, 1,121 multistorey car parks and 902 precinct pavilions) and are left out.

The numbers behind it

Residential blocks by HDB town, A to Z
TownBlocksOldest yearBlocks from that yearTypical yearCompleted before 1980
Ang Mo Kio39219756197968%
Bedok530197210198044%
Bishan2381973319872%
Bukit Batok4351982319850%
Bukit Merah426193720197755%
Bukit Panjang34619862919960%
Bukit Timah (not ranked: few blocks)2719734198826%
Central Area (not ranked: few blocks)7919633197956%
Choa Chu Kang5291977419942%
Clementi206197739197951%
Geylang31019588198439%
Hougang6101974419892%
Jurong East23419767198312%
Jurong West7441970219946%
Kallang/Whampoa312195928198047%
Marine Parade (not ranked: few blocks)591974361974100%
Pasir Ris4411975219931%
Punggol5572000520120%
Queenstown24219597197558%
Sembawang28119972820000%
Sengkang66919972820020%
Serangoon2321977819853%
Tampines9241981819890%
Tengah13920233020240%
Toa Payoh38619668198536%
Woodlands7411973419965%
Yishun7071977119870%
Singapore’s residential blocks by decade completed
DecadeBlocksShare
Before 1960951%
1960s2853%
1970s1,27012%
1980s3,34131%
1990s2,68625%
2000s8698%
2010s1,45613%
2020s7947%

The boring bit

Where the data comes from

HDB Property Information on data.gov.sg: one row for every HDB building, 13,357 rows, with the block number, street, town, year completed, floors and number of homes. Downloaded 7 Oct 2026; the dataset page says it was last updated on 6 Jul 2026. We kept the 10,796 rows marked residential, in 27 HDB towns. For the still-standing check we also used HDB’s Existing Building outlines (Nov 2025) and OneMap’s address search.

What is not claimed

  • The file gives the year completed, not the month or the lease start date. This page does not say how much lease a block has left.
  • A block here is a building with homes in it, not a single flat.
  • Towns are HDB’s own groupings. For example, the Changi Village Road blocks sit in Pasir Ris, and Kallang and Whampoa are one town.
  • We do not know whether a block was rebuilt, renamed or renumbered. Years are shown as the file gives them.
  • 56 blocks are dated 2026. HDB’s page says its data runs to Dec 2025, so we cannot say if those are finished or planned. They sit in the 2020s and change no “oldest” figure.
  • Typical year is not ranked for towns with fewer than 100 blocks (Bukit Timah (27), Marine Parade (59), Central Area (79)), because one project can move it. They appear in the numbers and on every other part of the page.
  • Older is not better or worse. We say nothing about price, condition or quality.
  • The still-standing check shows that an address and a building outline exist for the block number and street. It does not show the building is the original one.

Coverage

10,796 of 13,357 rows used. The other 2,561 have no homes (1,121 multistorey car parks and 902 precinct pavilions among them) and are left out. Every block counts once; nothing is sampled. 3 towns have fewer than 100 blocks (Bukit Timah, Marine Parade and Central Area) and are shown but not ranked by typical block, never left out. We checked 335 of 335 oldest-group blocks against OneMap and HDB’s building outlines.

Report an error. Corrections are logged publicly with a date.

How we did it
Data cleaningFilteringGroup mediansCounting tiesAddress cross-check
  1. Downloaded the whole file from data.gov.sg (13,357 rows) and turned the year, homes and floors into numbers.
  2. Kept blocks with homes (the residential flag is Y) and checked that none had zero homes or appeared twice.
  3. Decoded HDB’s town codes and checked all 27 against the street names in each group.
  4. Found each town’s oldest year and counted the blocks that share it, then took the middle (median) year, rounded half up.
  5. Cross-checked the 335 oldest-group blocks against OneMap addresses and HDB’s Existing Building outlines.
  6. Counted blocks by decade, for each town and for Singapore.
Show the Python code
"""Every number on the HDB block-age page comes from these functions, run on data/hdb_blocks.json."""
import json
from statistics import median

TOWNS = {  # HDB's own town codes, decoded from the street names in each group
    "AMK": "Ang Mo Kio", "BB": "Bukit Batok", "BD": "Bedok", "BH": "Bishan",
    "BM": "Bukit Merah", "BP": "Bukit Panjang", "BT": "Bukit Timah",
    "CCK": "Choa Chu Kang", "CL": "Clementi", "CT": "Central Area",
    "GL": "Geylang", "HG": "Hougang", "JE": "Jurong East", "JW": "Jurong West",
    "KWN": "Kallang/Whampoa", "MP": "Marine Parade", "PG": "Punggol",
    "PRC": "Pasir Ris", "QT": "Queenstown", "SB": "Sembawang", "SGN": "Serangoon",
    "SK": "Sengkang", "TAP": "Tampines", "TG": "Tengah", "TP": "Toa Payoh",
    "WL": "Woodlands", "YS": "Yishun",
}
DECADES = ["Before 1960", "1960s", "1970s", "1980s", "1990s", "2000s", "2010s", "2020s"]
FEW = 100  # towns with fewer blocks than this are shown but not ranked


def ru(x):
    """Round half up, the house rule."""
    return int(x + 0.5)


def decade(year):
    return 0 if year < 1960 else min(7, (year - 1950) // 10)


def load(path):
    """The residential blocks (Residential flag = Y), one dict each, and the file's row counts."""
    d = json.load(open(path, encoding="utf-8"))
    blocks = [dict(town=t, blk=b, street=s, yr=y, units=u, floors=f) for t, b, s, y, u, f in d["blocks"]]
    return d, blocks


def town_stats(blocks):
    by = {}
    for b in blocks:
        by.setdefault(b["town"], []).append(b["yr"])
    stats = {}
    for code, years in by.items():
        oldest = min(years)
        stats[code] = dict(
            name=TOWNS[code], blocks=len(years), oldest=oldest,
            tied=sum(1 for y in years if y == oldest), median=ru(median(years)),
            before1980=ru(100 * sum(1 for y in years if y < 1980) / len(years)),
            few=len(years) < FEW,  # shown, but not ranked
        )
    return stats


def decade_counts(blocks, town=None):
    g = [b for b in blocks if town is None or b["town"] == town]
    return [sum(1 for b in g if decade(b["yr"]) == d) for d in range(8)]

What could make it wrong: a year entered wrongly in HDB’s file, a block that was rebuilt under an older number, or towns whose boundaries differ from how people use the name. As a check, dropping the blocks dated 2025 or 2026 leaves the three towns with the oldest typical block the same (Queenstown, Bukit Merah, Ang Mo Kio).

No machine learning was needed. The questions were “when” and “how many”, which sorting and counting answer directly.

Sources: HDB, HDB Property Information (opens in a new tab) and HDB Existing Building (opens in a new tab), data.gov.sg, downloaded 7 Oct 2026; address lookups from OneMap, Singapore Land Authority. Contains information from data.gov.sg made available under the Singapore Open Data Licence.