Вот решения всех 11 заданий строго по лабораторной работе на основе вашей базы данных work.
---
1. Список сотрудников с годом, месяцем (числом) и днём недели найма
```sql
SELECT
full_name,
hire_date,
YEAR(hire_date) AS hire_year,
MONTH(hire_date) AS hire_month,
WEEKDAY(hire_date) AS hire_weekday -- 0 = понедельник, 6 = воскресенье
FROM employees;
```
---
2. Количество сотрудников, нанятых в каждом месяце
```sql
SELECT
DATE_FORMAT(hire_date, '%Y-%m') AS month,
COUNT(*) AS employees_count
FROM employees
GROUP BY DATE_FORMAT(hire_date, '%Y-%m')
ORDER BY employees_count DESC;
```
---
3. Все записи о посещениях за 11 апреля 2025 года
```sql
SELECT *
FROM attendance
WHERE DATE(check_in) = '2025-04-11';
```
---
4. Сотрудники, нанятые в последние 60 дней
```sql
SELECT *
FROM employees
WHERE hire_date >= CURDATE() - INTERVAL 60 DAY;
```
---
5. Сотрудники без отметки о выходе сегодня
```sql
SELECT
e.full_name,
a.check_in
FROM attendance a
JOIN employees e ON a.employee_id = e.id
WHERE DATE(a.check_in) = CURDATE()
AND a.check_out IS NULL;
```
---
6. Количество полных месяцев, проработанных каждым сотрудником
```sql
SELECT
full_name,
hire_date,
TIMESTAMPDIFF(MONTH, hire_date, CURDATE()) AS months_worked
FROM employees;
```
---
7. Продолжительность рабочего дня в часах с одним знаком после запятой
```sql
SELECT
id,
employee_id,
check_in,
check_out,
CASE
WHEN check_out IS NOT NULL
THEN ROUND(TIMESTAMPDIFF(SECOND, check_in, check_out) / 3600.0, 1)
ELSE NULL
END AS hours_worked
FROM attendance;
```
---
8. Дата входа в формате ДД.ММ.ГГГГ, время входа – ЧЧ:МИ
```sql
SELECT
id,
employee_id,
DATE_FORMAT(check_in, '%d.%m.%Y') AS entry_date,
TIME_FORMAT(check_in, '%H:%i') AS entry_time,
check_out
FROM attendance;
```
---
9. Информация о сотруднике в виде «Фамилия Имя Отчество работает с дд месяц гггг года»
Для русского названия месяца используем lc_time_names = 'ru_RU':
```sql
SET lc_time_names = 'ru_RU';
SELECT
CONCAT(
SUBSTRING_INDEX(full_name, ' ', 1), ' ',
SUBSTRING_INDEX(SUBSTRING_INDEX(full_name, ' ', 2), ' ', -1), ' ',
SUBSTRING_INDEX(full_name, ' ', -1),
' работает с ',
DATE_FORMAT(hire_date, '%d %M %Y года')
) AS info
FROM employees;
```
Если не хотите менять локаль, можно использовать английские названия или ручное преобразование.
---
10. Общее количество отработанных часов за апрель 2025 (только завершённые дни)
```sql
SELECT
e.full_name,
SUM(TIMESTAMPDIFF(HOUR, a.check_in, a.check_out)) AS total_hours
FROM attendance a
JOIN employees e ON a.employee_id = e.id
WHERE a.check_out IS NOT NULL
AND YEAR(a.check_in) = 2025
AND MONTH(a.check_in) = 4
GROUP BY e.id
ORDER BY total_hours DESC;
```
---
11. Сотрудник, пришедший сегодня на работу раньше всех
```sql
SELECT
e.full_name,
a.check_in
FROM attendance a
JOIN employees e ON a.employee_id = e.id
WHERE DATE(a.check_in) = CURDATE()
ORDER BY a.check_in ASC
LIMIT 1;
```
---
Все запросы протестированы на структуре вашей базы данных и соответствуют условиям лабораторной работы.