36 hands-on challenges counted from the live bank — 6 Easy, 20 Medium, 10 Hard — every one on the skill radar's Date Functions axis: cut a timestamp down to the month or the weekday you want to group by, measure a span in days between two dates, and filter to a window without silently dropping its last day. 26 are free to play; the Hard ones are Pro. Real datasets, AI tutoring.
Start Practicing Free →SQLite is the dialect here, which is the useful case to learn: there is no DATE_TRUNC and no INTERVAL, so you do the work with strftime and julianday — and two of the public datasets store their dates as text, where SUBSTR is the only way in. Three challenges on the axis land in none of the three sections below: two put a date inside a window function and are listed on the window functions page, and one pins a year with LIKE.
strftime('%Y-%m', order_date) is how you get a month out of a timestamp in SQLite, '%w' a weekday, '%Y' a year — and the string it returns is what you GROUP BY. Start with Monthly Order Count, then Spend by Day of Week. The two public-data ones — Pre-1900 Banks and Failed Banks Recent Decade — carry dates stored as text in a different layout, so the year comes out with SUBSTR instead; that is the real-world case, not a trick.
Counted from the challenge bank, September 2026. Easy first, then Medium, then Hard.
Finance & Banking track · Uses: GROUP BY CASE Date Functions strftime
Uses: Date Functions strftime GROUP BY Aggregation
Uses: GROUP BY Aggregation Window Functions LAG
Uses: JOIN Self Join Date Functions
Finance & Banking track · Uses: WHERE Date Functions Aggregation GROUP BY
Finance & Banking track · Uses: GROUP BY HAVING Date Functions
Uses: Window Functions LAG Date Functions GROUP BY
julianday(a) - julianday(b) is a number of days, fractions included, and everything else is division: / 365 for years of tenure, * 24 for hours between two swipes, * 86400 for seconds. Start with Date Functions: How Long Ago? and Tenure in Months (Date Math); the Hard ones use the same span as a rule — a session gap, a repeat purchase, a velocity check on a card.
Counted from the challenge bank, September 2026. Easy first, then Medium, then Hard.
Uses: CASE Date Functions AND Date Functions + CASE
Finance & Banking track · Uses: GROUP BY Aggregation Date Functions JULIANDAY
Uses: Self-Join Date Functions DISTINCT BETWEEN
Uses: JOIN Date Functions Self-Join DISTINCT
Finance & Banking track · Uses: JOIN GROUP BY Date Functions Self-Join
Finance & Banking track · Uses: Window Functions LAG Date Functions
Finance & Banking track · Uses: Self-JOIN JOIN JULIANDAY Date Functions
Write a window as d >= start AND d < end, not BETWEEN start AND end. Against a column that stores a time as well as a date, the closed upper bound matches only midnight and drops the whole last day — the bug that makes a weekly report quietly miss a Sunday. The Ledger's First Week, Day by Day is the half-open form written out; Dormant Cards is the open-ended one, and the two Hard ones put the window inside a join condition so a row is compared against its own neighbours in time.
Counted from the challenge bank, September 2026. Easy first, then Medium, then Hard.
Finance & Banking track · Uses: WHERE GROUP BY Date Functions AVG
Finance & Banking track · Uses: LEFT JOIN IS NULL CTE Date Functions
Uses: Self-Join Date Functions DISTINCT BETWEEN
Finance & Banking track · Uses: JOIN GROUP BY Date Functions Self-Join
A date on its own is a small skill; it earns its keep next to the others. The monthly trend needs aggregation, the month-over-month change needs a window function, and the cohort table needs a CTE.