
Mekki MOURADI
Data Analyst
Rabat, Maroc
À Propos
Data Analyst Junior avec une solide expérience en marketing numérique et des compétences approfondies dans l’utilisation de Microsoft Excel, SQL, Tableau Software et Python.
SQL Date Time Functions


Liens
Compétences & Outils
Description du projet
Apprendre à manipuler les données via les Fonctions de Dates :
- CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP
- AGE
- EXTRACT
- TO_CHAR
Objectifs de l'analyse
- Utiliser les Fonctions de Dates pour manipuler, extraire et formater des données de date et d’heure
- AGE
- Retrieve a list of the current age of all employees
SELECT emp_no,
AGE(CURRENT_DATE,birth_date) AS age
FROM employees
LIMIT 10;

emp_no | age |
---|---|
10001 | 70 years 4 mons 22 days |
10002 | 59 years 7 mons 22 days |
10003 | 64 years 1 mon 21 days |
10004 | 69 years 8 mons 23 days |
10005 | 69 years 3 days |
10006 | 70 years 9 mons 4 days |
10007 | 66 years 8 mons 1 day |
10008 | 65 years 11 mons 5 days |
10009 | 71 years 9 mons 5 days |
10010 | 60 years 7 mons 23 days |
- Retrieve a list of all employees ages as at when they were employed
SELECT emp_no,
AGE(hire_date, birth_date) AS age_employed
FROM employees
LIMIT 10;

emp_no | age_employed |
---|---|
10001 | 32 years 9 mons 24 days |
10002 | 21 years 5 mons 19 days |
10003 | 26 years 8 mons 25 days |
10004 | 32 years 7 mons |
10005 | 34 years 7 mons 22 days |
10006 | 36 years 1 mon 12 days |
10007 | 31 years 8 mons 18 days |
10008 | 36 years 6 mons 24 days |
10009 | 32 years 9 mons 29 days |
10010 | 26 years 2 mons 23 days |
- Retrieve a list of how long a manager worked at the company
SELECT emp_no,
AGE(to_date, from_date) AS years_employed
FROM dept_manager
ORDER BY AGE(to_date,from_date) DESC
LIMIT 10;

emp_no | years_employed |
---|---|
110114 | 8009 years 15 days |
111133 | 8007 years 9 mons 25 days |
111534 | 8007 years 8 mons 23 days |
110039 | 8007 years 3 mons |
110228 | 8006 years 9 mons 11 days |
110567 | 8006 years 8 mons 6 days |
110854 | 8004 years 6 mons 3 days |
111939 | 8002 years 11 mons 29 days |
110420 | 8002 years 4 mons 2 days |
110511 | 7 years 3 mons 24 days |
We can notice errors in the output, certainly due to some errors in the data. One way to tackle this issue from the start is to use this formula instead :
SELECT emp_no,
CASE
WHEN AGE(to_date, from_date) < AGE(CURRENT_DATE, from_date) THEN AGE(to_date, from_date)
ELSE AGE(CURRENT_DATE, from_date)
END AS years_employed
FROM dept_manager
ORDER BY AGE(to_date,from_date) DESC
LIMIT 10;

emp_no | years_employed |
---|---|
110114 | 34 years 1 mon 7 days |
111133 | 32 years 10 mons 17 days |
111534 | 32 years 9 mons 16 days |
110039 | 32 years 3 mons 23 days |
110228 | 31 years 10 mons 3 days |
110567 | 31 years 8 mons 29 days |
110854 | 29 years 6 mons 26 days |
111939 | 28 years 21 days |
110420 | 27 years 4 mons 25 days |
110511 | 7 years 3 mons 24 days |
- Retrieve a list of how long it took to ship a product to a customer
SELECT order_id,
AGE(ship_date,order_date) AS ship_time
FROM sales
LIMIT 10;

order_id | ship_time |
---|---|
CA-2016-152156 | 3 days |
CA-2016-152156 | 3 days |
CA-2016-138688 | 4 days |
US-2015-108966 | 7 days |
US-2015-108966 | 7 days |
CA-2014-115812 | 5 days |
CA-2014-115812 | 5 days |
CA-2014-115812 | 5 days |
CA-2014-115812 | 5 days |
CA-2014-115812 | 5 days |
- Retrieve a list of the first name, last name, salary, and how long the employee earned a salary
SELECT e.first_name, e.last_name, s.salary,
CASE
WHEN AGE(s.to_date, s.from_date) < AGE(CURRENT_DATE, s.from_date) THEN AGE(s.to_date, s.from_date)
ELSE AGE(CURRENT_DATE, s.from_date)
END AS period_salary
FROM employees e
JOIN salaries s
ON e.emp_no=s.emp_no
ORDER BY period_salary DESC
LIMIT 10;

first_name | last_name | salary | period_salary |
---|---|---|---|
Bokyung | Alpin | 68769 | 22 years 5 mons 22 days |
Aimee | Brookner | 70514 | 22 years 5 mons 22 days |
Arfst | Pulkowski | 51830 | 22 years 5 mons 22 days |
Sachin | Bach | 63992 | 22 years 5 mons 22 days |
Nevin | Dulay | 64657 | 22 years 5 mons 22 days |
Satoru | Otillio | 63629 | 22 years 5 mons 22 days |
Anneke | Preusig | 59755 | 22 years 5 mons 22 days |
Bezalel | Simmel | 72527 | 22 years 5 mons 22 days |
Masako | Besselaar | 74633 | 22 years 5 mons 22 days |
Fox | Magliocco | 74650 | 22 years 5 mons 22 days |
- EXTRACT
- Retrieve a list of the ship mode and how long (in seconds) it took to ship a product to a customer
SELECT order_line,
order_date,
ship_date,
EXTRACT(EPOCH FROM ship_date) - EXTRACT(EPOCH FROM order_date) AS seconds_taken
FROM sales
LIMIT 10;

order_line | order_date | ship_date | seconds_taken |
---|---|---|---|
1 | 2016-11-08 | 2016-11-11 | 259200 |
2 | 2016-11-08 | 2016-11-11 | 259200 |
3 | 2016-06-12 | 2016-06-16 | 345600 |
4 | 2015-10-11 | 2015-10-18 | 604800 |
5 | 2015-10-11 | 2015-10-18 | 604800 |
6 | 2014-06-09 | 2014-06-14 | 432000 |
7 | 2014-06-09 | 2014-06-14 | 432000 |
8 | 2014-06-09 | 2014-06-14 | 432000 |
9 | 2014-06-09 | 2014-06-14 | 432000 |
10 | 2014-06-09 | 2014-06-14 | 432000 |
- Retrieve a list of the ship mode and how long (in days) it took to ship a product to a customer
SELECT order_line,
order_date,
ship_date,
EXTRACT(DAY FROM ship_date) - EXTRACT(DAY FROM order_date) AS seconds_taken
FROM sales
LIMIT 10;

order_line | order_date | ship_date | seconds_taken |
---|---|---|---|
1 | 2016-11-08 | 2016-11-11 | 3 |
2 | 2016-11-08 | 2016-11-11 | 3 |
3 | 2016-06-12 | 2016-06-16 | 4 |
4 | 2015-10-11 | 2015-10-18 | 7 |
5 | 2015-10-11 | 2015-10-18 | 7 |
6 | 2014-06-09 | 2014-06-14 | 5 |
7 | 2014-06-09 | 2014-06-14 | 5 |
8 | 2014-06-09 | 2014-06-14 | 5 |
9 | 2014-06-09 | 2014-06-14 | 5 |
10 | 2014-06-09 | 2014-06-14 | 5 |
- Retrieve a list of the current age of all employees
SELECT first_name,
last_name,
birth_date,
EXTRACT(YEAR FROM CURRENT_DATE)-EXTRACT(YEAR FROM birth_date) || ' years old' AS current_age
FROM employees
LIMIT 10;

first_name | last_name | birth_date | current_age |
---|---|---|---|
Georgi | Facello | 1953-09-02 | 71 years old |
Bezalel | Simmel | 1964-06-02 | 60 years old |
Parto | Bamford | 1959-12-03 | 65 years old |
Chirstian | Koblick | 1954-05-01 | 70 years old |
Kyoichi | Maliniak | 1955-01-21 | 69 years old |
Anneke | Preusig | 1953-04-20 | 71 years old |
Tzvetan | Zielinski | 1957-05-23 | 67 years old |
Saniya | Kalloufi | 1958-02-19 | 66 years old |
Sumant | Peac | 1952-04-19 | 72 years old |
Duangkaew | Piveteau | 1963-06-01 | 61 years old |
- Retrieve a list of all employees ages as at when they were employed
SELECT first_name,
last_name,
EXTRACT(YEAR FROM hire_date)-EXTRACT(YEAR FROM birth_date) || ' years old' AS age_employed
FROM employees
LIMIT 10;

first_name | last_name | age_employed |
---|---|---|
Georgi | Facello | 33 years old |
Bezalel | Simmel | 21 years old |
Parto | Bamford | 27 years old |
Chirstian | Koblick | 32 years old |
Kyoichi | Maliniak | 34 years old |
Anneke | Preusig | 36 years old |
Tzvetan | Zielinski | 32 years old |
Saniya | Kalloufi | 36 years old |
Sumant | Peac | 33 years old |
Duangkaew | Piveteau | 26 years old |
- Retrieve a list of all employees who where 25 or less than 25 years as at when they were employed
SELECT first_name,
last_name,
EXTRACT(YEAR FROM hire_date)-EXTRACT(YEAR FROM birth_date) || ' years old' AS age_employed
FROM employees
WHERE EXTRACT(YEAR FROM hire_date)-EXTRACT(YEAR FROM birth_date)<=25
ORDER BY age_employed DESC
LIMIT 10;

first_name | last_name | age_employed |
---|---|---|
Vishu | Strehl | 25 years old |
Hugo | Rosis | 25 years old |
Sibyl | Nooteboom | 25 years old |
Satosi | Awdeh | 25 years old |
Charlene | Brattka | 25 years old |
Kshitij | Gils | 25 years old |
Zissis | Pintelas | 25 years old |
Kendra | Hofting | 25 years old |
Valdiodio | Niizuma | 25 years old |
Xinglin | Plessier | 25 years old |
- How many employees were 25 or less than 25 years as at when they were employed
SELECT COUNT(EXTRACT(YEAR FROM hire_date)-EXTRACT(YEAR FROM birth_date)) AS count_employees
FROM employees
WHERE EXTRACT(YEAR FROM hire_date)-EXTRACT(YEAR FROM birth_date)<=25
count_employees |
---|
1579 |
- Retrieve the distribution of employees under 25 years
SELECT EXTRACT(YEAR FROM hire_date)-EXTRACT(YEAR FROM birth_date) || ' years' AS age_group,
COUNT(EXTRACT(YEAR FROM hire_date)-EXTRACT(YEAR FROM birth_date)) AS number_of_employees
FROM employees
WHERE EXTRACT(YEAR FROM hire_date)-EXTRACT(YEAR FROM birth_date)<=25
GROUP BY age_group
ORDER BY age_group
age_group | number_of_employees |
---|---|
20 years | 2 |
21 years | 101 |
22 years | 252 |
23 years | 313 |
24 years | 431 |
25 years | 480 |
- Retrieve a list of the product id, the month of sales and sales for chairs sub category in the year 2015
SELECT product_id, EXTRACT(MONTH FROM order_date), sales, order_date, sub_category
FROM sales
WHERE sub_category='Chairs' AND EXTRACT(YEAR FROM order_date) = 2015
LIMIT 10;

product_id | extract | sales | order_date | sub_category |
---|---|---|---|---|
FUR-CH-10004218 | 12 | 212.06 | 2015-12-27 | Chairs |
FUR-CH-10003061 | 4 | 89.99 | 2015-04-18 | Chairs |
FUR-CH-10001146 | 4 | 213.12 | 2015-04-30 | Chairs |
FUR-CH-10000513 | 4 | 831.94 | 2015-04-26 | Chairs |
FUR-CH-10004698 | 11 | 396.8 | 2015-11-21 | Chairs |
FUR-CH-10004860 | 2 | 161.57 | 2015-02-28 | Chairs |
FUR-CH-10004477 | 2 | 389.7 | 2015-02-28 | Chairs |
FUR-CH-10000595 | 11 | 190.72 | 2015-11-07 | Chairs |
FUR-CH-10002647 | 12 | 283.92 | 2015-12-07 | Chairs |
FUR-CH-10003956 | 7 | 70.98 | 2015-07-03 | Chairs |
- Retrieve a list of the month of sales and sum of sales for each month for Chairs sub category in the year 2015
SELECT TO_CHAR(order_date::DATE, 'Month') AS month_2015,
SUM(sales) AS total_sales
FROM sales
WHERE sub_category='Chairs' AND EXTRACT(YEAR FROM order_date) = 2015
GROUP BY month_2015
ORDER BY EXTRACT(MONTH FROM MIN(order_date));

month_2015 | total_sales |
---|---|
January | 3246.79 |
February | 2114.89 |
March | 4085.23 |
April | 4271.63 |
May | 5681.94 |
June | 3937.89 |
July | 7313.56 |
August | 1439.01 |
September | 9519.93 |
October | 7103.54 |
November | 12743.14 |
December | 10276.99 |