Calculate Employee Tenure in Days and Sort by Longest
Return every employee with the number of days since their hire date, longest-serving first.
The challenge runs on the SQLabHub practice database (SQLite) and uses the employees table. You can solve it in the browser, with nothing to install.
The task
Find employees with longest tenure.
A correct answer returns 120 rows with 13 columns: id, first_name, last_name, email, department, department_id, title, salary, hire_date, manager_id, city, status, tenure.
Tables used in this challenge
employees 120 rows
id INTEGER (PK) · first_name TEXT · last_name TEXT · email TEXT · department TEXT · department_id INTEGER · title TEXT · salary REAL · hire_date TEXT · manager_id INTEGER · city TEXT · status TEXT
| id | first_name | last_name | department | department_id | title | salary | hire_date | manager_id | city | status | |
|---|---|---|---|---|---|---|---|---|---|---|---|
The first rows of each table are shown. See how all the tables relate on the database schema page.
Expected output
The result has the columns listed above and 120 rows. This query depends on today's date, so its values change from day to day and no fixed rows are shown here.
What you practise
- Working with dates in SQLite: strftime, julianday and DATE
- Sorting the result with ORDER BY
- Deriving a new column from an expression and naming it with an alias
Hint and approach
Try the challenge first. Open these only when you need them.
Show the hint
julianday difference
Show the step-by-step approach
How the model solution is built, in the order the database evaluates it:
- Read from the
employeestable. - Add the calculated column
tenure:julianday('now') - julianday(hire_date). - Sort the result by
tenuredescending.
Model solution
Checking your session…
What to watch for
julianday('now') is the current date, so the tenure column changes every day and no fixed expected values can be shown. The order stays the same. Divide by 365.25 for years.
- Date functions. These date functions are SQLite syntax. MySQL uses DATE_FORMAT and DATEDIFF, PostgreSQL uses TO_CHAR, EXTRACT and date subtraction.
- Calculated columns. Dividing one integer by another truncates the result in SQLite. Multiply one side by 1.0 to get decimals.
- ORDER BY. Without ORDER BY the row order is not guaranteed, even if it looks stable. Rows that tie on the sort columns can come back in any order.
Related SQL challenges
- Sort Products by Profit Margin (Price Minus Cost)Similar levelHard
- Calculate the Average Value per Item of Each OrderSimilar levelHard
- Calculate Monthly Revenue with strftimeEasierMedium
- Calculate Customer Lifetime in Days from First to Last OrderSimilar levelHard
- Find the Longest Gap Between Consecutive HiresSimilar levelHard
Keep learning
- Lesson: Date Functions
- Lesson: Comments & Aliases
- Lesson: ORDER BY
- All SQL practice challenges, by difficulty and topic
- SQL interview questions with answers
- SQL Playground: run any query on the same database