Code Lab is in development. New lessons and improvements are on the way. Progress can be deleted.
Loading…
Code Lab is in development. New lessons and improvements are on the way. Progress can be deleted.
Loading…
Code Lab is in development. New lessons and improvements are on the way. Progress can be deleted.
SQL / POSTGRESQL / Learn / LESSON 02
INTERVAL is a duration: INTERVAL '1 month', INTERVAL '14 days'. DATE '2024-02-01' + INTERVAL '1 month' gives the start of the next month (2024-03-01 00:00:00). The result is a TIMESTAMP, but comparing it with a DATE works.
The safest way to describe a period is a half-open interval "from inclusive, to exclusive": order_date >= DATE '2024-02-01' AND order_date < DATE '2024-03-01'. February 2024 keeps all its days (the 29th included) and 1 March stays out. Do not write "up to 29 February" with <= or BETWEEN: with a TIMESTAMP column an order late on 29 February would be lost, and the day count changes in leap years.
You can derive the upper bound from the lower one with INTERVAL: < DATE '2024-02-01' + INTERVAL '1 month'. Always spell the bounds out in the condition.
Common mistakes: <= the last day instead of < the next first day; BETWEEN with an end day; INTERVAL without quotes ('1 month'); checking only one bound.
Small example:
SELECT COUNT(*) AS orders_count FROM orders WHERE order_date >= DATE '2024-01-01' AND order_date < DATE '2024-01-01' + INTERVAL '1 month';
Working tables for this task. Grading also uses other datasets with the same schema.
| id | name | category | price |
|---|---|---|---|
| 1 | Atlas | books | 30 |
| 2 | Novel | books | 15 |
| 3 | Comic | books | 14.99 |
| 4 | Lamp | home | 29.99 |
| 5 | Vase | home | 30 |
| 6 | Rug | home | 45 |
| 7 | Hammer | tools | 15 |
| 8 | Drill | tools | 60 |
| 9 | Tape | tools | 15 |
| 10 | Candle | NULL | 8.5 |
| 11 | Gift Card | NULL | 25 |
| id | name | city |
|---|---|---|
| 1 | Mira | Sofia |
| 2 | Niko | Varna |
| 3 | Iva | Sofia |
| 4 | Alex | NULL |
| 5 | Boris | Plovdiv |
| 6 | Lena | Varna |
| 7 | Petya | Sofia |
| id | customer_id | total | order_date |
|---|---|---|---|
| 1 | 1 | 120 | 2024-01-05 |
| 2 | 1 | 35.5 | 2024-01-20 |
| 3 | 2 | 40 | 2024-01-20 |
| 4 | 3 | 99.99 | 2024-01-31 |
| 5 | NULL | 60 | 2024-02-01 |
| 6 | 1 | 40 | 2024-02-01 |
| 7 | 2 | 75.25 | 2024-02-14 |
| 8 | 3 | 100 | 2024-02-15 |
| 9 | 5 | 22 | 2024-02-15 |
| 10 | 1 | 39.99 | 2024-02-29 |
| 11 | 2 | 55 | 2024-03-01 |
| 12 | 3 | 18 | 2024-03-10 |
| 13 | 1 | 130 | 2024-03-15 |
| 14 | 2 | 40 | 2024-03-15 |
| 15 | 2 | 12.5 | 2024-03-31 |
| 16 | 3 | 47 | 2024-04-01 |
Expected columns: id, order_date, total · row order is not required
Expected result (displayed data):
Loading…INTERVAL is a duration: INTERVAL '1 month', INTERVAL '14 days'. DATE '2024-02-01' + INTERVAL '1 month' gives the start of the next month (2024-03-01 00:00:00). The result is a TIMESTAMP, but comparing it with a DATE works. The safest way to describe a period is a half-open interval "from inclusive, to exclusive": order_date >= DATE '2024-02-01' AND order_date < DATE '2024-03-01'. February 2024 keeps all its days (the 29th included) and 1 March stays out. Do not write "up to 29 February" with <= or BETWEEN: with a TIMESTAMP column an order late on 29 February would be lost, and the day count changes in leap years. You can derive the upper bound from the lower one with INTERVAL: < DATE '2024-02-01' + INTERVAL '1 month'. Always spell the bounds out in the condition. Common mistakes: <= the last day instead of < the next first day; BETWEEN with an end day; INTERVAL without quotes ('1 month'); checking only one bound.
QUERY STANDBY
›