๐ง SQL Level 7 โ Date & Time Functions + Time-Based Analysis
Date and time analysis is one of the most important SQL skills for a Data Analyst.
Real business data is heavily time-dependent:
๐ Monthly revenue
๐ Year-over-year growth
๐ Daily orders
๐ฅ Customer activity
๐ฆ Product demand
โฑ๏ธ Response time
๐ Retention and cohort analysis
To become strong in SQL, you need to know how to extract, filter, compare, group, and calculate differences between dates.
๐น 1. Understanding Date & Time Data Types
โข DATE โ Date only
โข TIME โ Time only
โข DATETIME / TIMESTAMP โ Date + time
Order_Date: 2026-01-15
Order_Timestamp: 2026-01-15 14:35:20
๐น 2. Extracting Parts of a Date
SELECT
Order_Date,
EXTRACT(YEAR FROM Order_Date) AS Order_Year,
EXTRACT(MONTH FROM Order_Date) AS Order_Month
FROM Orders;
๐น 3. Grouping Sales by Year
SELECT
EXTRACT(YEAR FROM Order_Date) AS Order_Year,
SUM(Sales) AS Total_Sales
FROM Orders
GROUP BY EXTRACT(YEAR FROM Order_Date)
ORDER BY Order_Year;
๐น 4. Grouping Sales by Month
SELECT
EXTRACT(YEAR FROM Order_Date) AS Order_Year,
EXTRACT(MONTH FROM Order_Date) AS Order_Month,
SUM(Sales) AS Total_Sales
FROM Orders
GROUP BY
EXTRACT(YEAR FROM Order_Date),
EXTRACT(MONTH FROM Order_Date)
ORDER BY Order_Year, Order_Month;
โ ๏ธ Don't group only by month number when data covers multiple years โ Jan 2025 + Jan 2026 would merge incorrectly.
๐น 5. Filtering Data by Date
SELECT * FROM Orders
WHERE Order_Date >= '2026-01-01'
AND Order_Date < '2026-02-01';
๐น 6. Why Date Ranges Matter
If
Order_Timestamp = 2026-01-31 23:30:00, thenWHERE Order_Timestamp <= '2026-01-31' will miss it.Use half-open range:
WHERE Order_Timestamp >= '2026-01-01'
AND Order_Timestamp < '2026-02-01'
๐น 7. Date Difference
Conceptually:
Date_Difference(First_Purchase_Date, Signup_Date)Dialects vary:
DATEDIFF(), DATE_DIFF(), subtraction, etc.๐น 8. Customers Who Took >30 Days to Purchase
SELECT Customer_ID, Signup_Date, First_Purchase_Date
FROM Customers
WHERE DATEDIFF(day, Signup_Date, First_Purchase_Date) > 30;
๐น 9. Adding / Subtracting Dates
Signup_Date + INTERVAL '30' DAY -- 30 days after signup
Order_Date - INTERVAL '7' DAY -- 7 days before order
๐น 10. Current Date and Time
CURRENT_DATE, CURRENT_TIMESTAMP โ useful for today's sales, active subs, overdue orders.๐น 11. Recent Orders (Last 30 Days)
SELECT * FROM Orders
WHERE Order_Date >= CURRENT_DATE - INTERVAL '30' DAY;
๐น 12. Year-over-Year Analysis
Formula:
(Current - Previous) / Previous * 100In SQL:
LAG(Sales) OVER (ORDER BY Year)
๐น 13. Month-over-Month Growth
WITH Monthly_Sales AS (
SELECT
EXTRACT(YEAR FROM Order_Date) AS Year,
EXTRACT(MONTH FROM Order_Date) AS Month,
SUM(Sales) AS Total_Sales
FROM Orders
GROUP BY 1, 2
)
SELECT
Year, Month, Total_Sales,
LAG(Total_Sales) OVER (ORDER BY Year, Month) AS Previous_Month_Sales
FROM Monthly_Sales;
๐น 14. Quarter Analysis
EXTRACT(QUARTER FROM Order_Date)
-- Q1: Jan-Mar, Q2: Apr-Jun, Q3: Jul-Sep, Q4: Oct-Dec
๐น 15. First and Last Transaction
ROW_NUMBER() OVER (
PARTITION BY Customer_ID
ORDER BY Order_Date
)
-- rn = 1 is first transaction