📖 Scenario: You are managing a small online store database. You need to keep track of when orders are placed and delivered.
🎯 Goal: Build a simple MySQL table to store order dates and learn why handling dates correctly is important.
📋 What You'll Learn
Create a table named orders with columns order_id (integer), order_date (date), and delivery_date (date).
Add a configuration variable to set a delivery threshold date.
Write a query to find orders delivered after the threshold date.
Add a final query to count how many orders were delivered late.
💡 Why This Matters
🌍 Real World
Tracking order and delivery dates is common in online stores, logistics, and many business systems.
💼 Career
Database professionals often write queries involving dates to generate reports, monitor deadlines, and ensure timely operations.
Progress0 / 4 steps
1
Create the orders table
Write a MySQL statement to create a table called orders with three columns: order_id as an integer, order_date as a DATE type, and delivery_date as a DATE type.
MySQL
Hint
Use CREATE TABLE with column names and types exactly as specified.
2
Set a delivery threshold date
Create a MySQL variable called @delivery_threshold and set it to the date '2024-01-01'.
MySQL
Hint
Use SET to assign the date string to the variable.
3
Query orders delivered after the threshold
Write a SELECT query to get all columns from orders where delivery_date is greater than the variable @delivery_threshold.
MySQL
Hint
Use a WHERE clause comparing delivery_date to @delivery_threshold.
4
Count late deliveries
Write a SELECT query to count the number of orders where delivery_date is after @delivery_threshold. Name the count column late_deliveries.
MySQL
Hint
Use COUNT(*) with an alias and the same WHERE condition.
Practice
(1/5)
1. Why is it important to use the DATE or DATETIME data types in MySQL when working with dates?
easy
A. They allow accurate sorting and filtering of date values.
B. They store dates as plain text for easy reading.
C. They automatically convert dates to strings when queried.
D. They prevent any date values from being stored.
Solution
Step 1: Understand the role of DATE and DATETIME types
These types store date and time in a format MySQL can recognize and process.
Step 2: Explain benefits for sorting and filtering
Using these types allows MySQL to sort and filter dates correctly, unlike plain text.
Final Answer:
They allow accurate sorting and filtering of date values. -> Option A
Quick Check:
Date types enable correct date operations [OK]
Hint: Use DATE/DATETIME for real date operations, not text [OK]
Common Mistakes:
Thinking dates are stored as plain text
Assuming automatic string conversion is always correct
Ignoring the need for proper date types
2. Which of the following is the correct syntax to create a table with a date column in MySQL?
easy
A. CREATE TABLE events (id INT, event_date TEXT);
B. CREATE TABLE events (id INT, event_date VARCHAR(10));
C. CREATE TABLE events (id INT, event_date DATE);
D. CREATE TABLE events (id INT, event_date NUMBER);
Solution
Step 1: Identify the correct data type for dates
The DATE type is designed to store date values in MySQL.
Step 2: Check the syntax for table creation
CREATE TABLE events (id INT, event_date DATE); uses DATE correctly, while others use incorrect types like TEXT or NUMBER.
Final Answer:
CREATE TABLE events (id INT, event_date DATE); -> Option C
Quick Check:
DATE type is correct for date columns [OK]
Hint: Use DATE type for date columns, not text or numbers [OK]
Common Mistakes:
Using TEXT or VARCHAR for dates
Using NUMBER which is invalid for dates
Confusing data types syntax
3. Given the table orders with a order_date column of type DATE, what will this query return?
SELECT * FROM orders WHERE order_date > '2024-01-01' ORDER BY order_date ASC;
medium
A. All orders on or before January 1, 2024, sorted descending.
B. All orders after January 1, 2024, sorted ascending by date.
C. All orders including January 1, 2024, sorted ascending by date.
D. Syntax error due to wrong date format.
Solution
Step 1: Understand the WHERE clause condition
The condition order_date > '2024-01-01' selects orders strictly after January 1, 2024.
Step 2: Analyze the ORDER BY clause
The results are sorted in ascending order by order_date, from earliest to latest after the date.
Final Answer:
All orders after January 1, 2024, sorted ascending by date. -> Option B
Quick Check:
WHERE > '2024-01-01' + ORDER BY ASC = All orders after January 1, 2024, sorted ascending by date. [OK]
Hint: Remember > excludes the date itself, ORDER BY ASC sorts earliest first [OK]
Common Mistakes:
Including the date '2024-01-01' with > instead of >=
Confusing ascending and descending order
Thinking date format causes syntax error
4. You wrote this query to find orders from 2023:
SELECT * FROM orders WHERE order_date = '2023-13-01';
Why does it fail and how to fix it?
medium
A. Day 01 is invalid; fix by using '2023-13-31'.
B. No error; query runs fine.
C. Date format is wrong; fix by using '01-13-2023'.
D. Month 13 is invalid; fix by using a valid month like '2023-12-01'.
Solution
Step 1: Identify invalid date parts
The month value '13' is invalid because months range from 01 to 12.
Step 2: Correct the date format and values
Use a valid month like '12' to fix the date, e.g., '2023-12-01'.
Final Answer:
Month 13 is invalid; fix by using a valid month like '2023-12-01'. -> Option D
Quick Check:
Month must be 01-12, 13 is invalid [OK]
Hint: Check month values are 01-12 to avoid invalid date errors [OK]
Common Mistakes:
Assuming day 01 is invalid
Using wrong date format like MM-DD-YYYY
Ignoring invalid month values
5. You want to find all users who registered within the last 30 days using a registration_date column of type DATE. Which query correctly achieves this?
hard
A. SELECT * FROM users WHERE registration_date >= CURDATE() - INTERVAL 30 DAY;
B. SELECT * FROM users WHERE registration_date < CURDATE() + INTERVAL 30 DAY;
C. SELECT * FROM users WHERE registration_date = CURDATE() - 30;
D. SELECT * FROM users WHERE registration_date > CURDATE() - 30;
Solution
Step 1: Understand the date range needed
We want users registered from 30 days ago up to today, so dates greater or equal to CURDATE() - INTERVAL 30 DAY.
Step 2: Analyze each option's correctness
SELECT * FROM users WHERE registration_date >= CURDATE() - INTERVAL 30 DAY; uses correct syntax and logic. SELECT * FROM users WHERE registration_date < CURDATE() + INTERVAL 30 DAY; checks for dates less than future date, which is incorrect. SELECT * FROM users WHERE registration_date = CURDATE() - 30; uses invalid arithmetic on dates. SELECT * FROM users WHERE registration_date > CURDATE() - 30; subtracts 30 as a number, not interval.
Final Answer:
SELECT * FROM users WHERE registration_date >= CURDATE() - INTERVAL 30 DAY; -> Option A
Quick Check:
Use INTERVAL for date math, >= for last 30 days [OK]
Hint: Use INTERVAL syntax and CURDATE() for date calculations [OK]
Common Mistakes:
Using arithmetic without INTERVAL keyword
Confusing < and > operators
Using = instead of range comparison
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.