015 Date Time Function
015 Date Time Function
Most of the data in the real world include date-time data. For most of the analysis, we need to perform
data manipulation on date columns to perform research (not limited) to:
● Analysis using time data( Eg: Number of days since a customer made a transaction, time is taken
between two cab
We need to learn SQL functions for manipulating data for all the analyses mentioned above.
Class 31
17
27
4 #90DaysofPurpose
#150DaysofPurpose
Date/Time Data Types
Class 31
17
27
4 #90DaysofPurpose
#150DaysofPurpose
Understanding Data Time Functions
In the coming slides, we will understand the usage of each function with a demonstration. We will use the below dataset for
demonstration:
Ride_share
Class 31
17
27
4 #90DaysofPurpose
#150DaysofPurpose
NOW() Function
Class 31
17
27
4 #90DaysofPurpose
#150DaysofPurpose
CURRENT_DATE Function
Class 31
17
27
4 #90DaysofPurpose
#150DaysofPurpose
CURRENT_TIME Function
Class 31
17
27
4 #90DaysofPurpose
#150DaysofPurpose
DATE() Function
Class 31
17
27
4 #90DaysofPurpose
#150DaysofPurpose
EXTRACT() Function
1. Field: It refers to the value you want to extract from the date/time datatype
1. Date/time source: It refers to the date/time column from which we want to extract the field
Class 31
17
27
4 #90DaysofPurpose
#150DaysofPurpose
EXTRACT() Function – Possible inputs for Field
Class 31
17
27
4 #90DaysofPurpose
#150DaysofPurpose
EXTRACT() Function – Possible inputs for Field
Class 31
17
27
4 #90DaysofPurpose
#150DaysofPurpose
EXTRACT() Function – An Example
Query
SELECT *,
EXTRACT(DAY FROM start_time) AS ride_start_day,
EXTRACT(MONTH FROM start_time) AS ride_start_month,
EXTRACT(YEAR FROM start_time) AS ride_start_year
FROM ride_share
Output
Class 31
17
27
4 #90DaysofPurpose
#150DaysofPurpose
Instructions for practice questions
tutorial.crunchbase_acquisitions_clean_date
Class 31
17
27
4 #90DaysofPurpose
#150DaysofPurpose
Practice Question - 1
Instructions:
Use tutorial.dc_bikeshare_q1_2012 table. Extract the month from start_terminal and then count the id.
Class 31
17
27
4 #90DaysofPurpose
#150DaysofPurpose
Solution - 1
SELECT
EXTRACT(month FROM start_time) AS month,
COUNT(id) AS num_rides
FROM
tutorial.dc_bikeshare_q1_2012
GROUP BY 1
ORDER BY
month
Class 31
17
27
4 #90DaysofPurpose
#150DaysofPurpose
Solution - 1
Output
Class 31
17
27
4 #90DaysofPurpose
#150DaysofPurpose
Practice Question - 2
Instructions:
Use tutorial.dc_bikeshare_q1_2012 table. Extract the month from start_terminal and then count the id and group by rider type.
Class 31
17
27
4 #90DaysofPurpose
#150DaysofPurpose
Solution - 2
SELECT
EXTRACT(month FROM start_time) AS month,
rider_type,
COUNT(id) AS num_rides
FROM
tutorial.dc_bikeshare_q1_2012
GROUP BY 1, rider_type
ORDER BY
month
Class 31
17
27
4 #90DaysofPurpose
#150DaysofPurpose
Solution - 2
Output
Class 31
17
27
4 #90DaysofPurpose
#150DaysofPurpose
Adding time interval to the date/time column
We can add a time interval to a date/time column. The interval value can be minute, hour, day, week,
month.
Syntax
* Refer to the field values discussed earlier to find the interval values
Class 31
17
27
4 #90DaysofPurpose
#150DaysofPurpose
Adding time interval to the date/time column
Query
SELECT *,
id, start_time, start_time + INTERVAl '1 DAY' AS start_date_day_add, start_time + INTERVAl '1 HOUR' AS start_date_hour_add,
start_time + INTERVAl '1 WEEK' AS start_date_week_add, start_time + INTERVAl '1 MONTH' AS start_date_month_add
FROM ride_share
Output
Class 31
17
27
4 #90DaysofPurpose
#150DaysofPurpose
Subtracting time interval from date/time column
We can add a time interval to a date/time column. Interval value can be minute, hour, day,
week, month.
* Refer to the field values discussed earlier to find the interval values
Class 31
17
27
4 #90DaysofPurpose
#150DaysofPurpose
Subtracting time interval from date/time column
Query
SELECT *,
id, start_time, start_time - INTERVAl '1 DAY' AS start_date_day_diff, start_time - INTERVAl '1 HOUR' AS start_date_hour_diff, start_time -
INTERVAl '1 WEEK' AS start_date_week_diff, start_time - INTERVAl '1 MONTH' AS start_date_month_diff
FROM ride_share
Output
Class 31
17
27
4 #90DaysofPurpose
#150DaysofPurpose
Practice Question - 3
Find the difference (in hours) between the first ride and the last ride per terminal. Show terminal_id, first ride start time, last ride start time,
and the difference in hours.
Instructions:
Use tutorial.dc_bikeshare_q1_2012 table. Use the Max and Min functions to find the last and first ride. Subtract the first and last ride time
using date_part function.
Class 31
17
27
4 #90DaysofPurpose
#150DaysofPurpose
Solution - 3
SELECT
start_terminal,
first_ride_start,
last_ride_start,
DATE_PART('day',last_ride_start - first_ride_start) *24 + DATE_PART('hour',last_ride_start - first_ride_start) AS diff_hours
FROM(
SELECT
start_terminal,
MIN(start_time) AS first_ride_start,
MAX(start_time) AS last_ride_start
FROM
tutorial.dc_bikeshare_q1_2012
GROUP BY start_terminal
) AS a
Class 31
17
27
4 #90DaysofPurpose
#150DaysofPurpose
Solution - 3
Output
Class 31
17
27
4 #90DaysofPurpose
#150DaysofPurpose
Subtracting two dates
* Refer to the field values discussed earlier to find the interval values
Class 31
17
27
4 #90DaysofPurpose
#150DaysofPurpose
Subtracting two dates
Query
SELECT *,
DATE_PART('minute',end_time - start_time) AS diff_minutes
FROM
ride_share
Output
Class 31
17
27
4 #90DaysofPurpose
#150DaysofPurpose
Practice Question - 4
Instructions:
Join tutorial.crunchbase_companies_clean_date and tutorial.crunchbase_acquisitions_clean_date . Take a difference between the
founded date and acquired date.
Class 31
17
27
4 #90DaysofPurpose
#150DaysofPurpose
Solution - 4
SELECT
companies.permalink,
companies.founded_at_clean,
acquisitions.acquired_at_cleaned,
acquisitions.acquired_at_cleaned - companies.founded_at_clean::timestamp AS time_to_acquisition
FROM
tutorial.crunchbase_companies_clean_date companies
JOIN
tutorial.crunchbase_acquisitions_clean_date acquisitions
ON acquisitions.company_permalink = companies.permalink
WHERE founded_at_clean IS NOT NULL
Class 31
17
27
4 #90DaysofPurpose
#150DaysofPurpose
Solution - 4
Output
Class 31
17
27
4 #90DaysofPurpose
#150DaysofPurpose
Practice Question - 5
Instructions:
Use tutorial.crunchbase_companies_clean_date. Use NOW() function and subtract it with the founded date.
Class 31
17
27
4 #90DaysofPurpose
#150DaysofPurpose
Solution - 5
SELECT
companies.permalink,
companies.founded_at_clean,
NOW() - companies.founded_at_clean::timestamp AS founded_time_ago
FROM
tutorial.crunchbase_companies_clean_date companies
WHERE
founded_at_clean IS NOT NULL
Class 31
17
27
4 #90DaysofPurpose
#150DaysofPurpose
Solution - 5
Output
Class 31
17
27
4 #90DaysofPurpose
#150DaysofPurpose
Practice Question - 6
Write a query that counts the number of companies acquired within 3 years, 5 years, and 10 years of being founded (in 3 separate
columns). Include a column for total companies acquired as well. Group by the category and limit to only rows with a founding date.
Instructions:
Use tutorial.crunchbase_companies_clean_date. Use NOW() function and subtract it with the founded date.
Class 31
17
27
4 #90DaysofPurpose
#150DaysofPurpose
Solution - 6
SELECT
companies.category_code,
COUNT(CASE WHEN acquisitions.acquired_at_cleaned <= companies.founded_at_clean::timestamp + INTERVAL '3 years' THEN 1
ELSE NULL END) AS acquired_3_yrs,
COUNT(CASE WHEN acquisitions.acquired_at_cleaned <= companies.founded_at_clean::timestamp + INTERVAL '5 years' THEN 1
ELSE NULL END) AS acquired_5_yrs,
COUNT(CASE WHEN acquisitions.acquired_at_cleaned <= companies.founded_at_clean::timestamp + INTERVAL '10 years' THEN 1
ELSE NULL END) AS acquired_10_yrs,
COUNT(1) AS total
FROM
tutorial.crunchbase_companies_clean_date companies
JOIN
tutorial.crunchbase_acquisitions_clean_date acquisitions
ON acquisitions.company_permalink = companies.permalink
WHERE founded_at_clean IS NOT NULL
GROUP BY 1
ORDER BY 5 DESC
Class 31
17
27
4 #90DaysofPurpose
#150DaysofPurpose
Solution - 6
Output
Class 31
17
27
4 #90DaysofPurpose
#150DaysofPurpose
Curious Case of Date Time Function
Unlike aggregate and windows functions, time date functions depend significantly on the database type.
The functions which work on one database might not work on another.
For Example:
● In the PostgreSQL database, we use the date_part() function to take the difference between two
dates. In the MySQL database, we can use the DATEDIFF function.
● Similarly, MYSQL uses CUR_TIME CUR_DATE to find the current time or date. Whereas PostgreSQL
use CURRENT_TIME and CURRENT_DATE
In this session, we have taught functions by PostgreSQL. We will advise referring to the database type
before using the date/time function.
Class 31
17
27
4 #90DaysofPurpose
#150DaysofPurpose
In the next class we will study:
Class 31
17
27
4 #90DaysofPurpose
#150DaysofPurpose
THANK YOU
Class 31
17
27
4 #90DaysofPurpose
#150DaysofPurpose