Загрузка данных


Вот решения всех 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;
```

---

Все запросы протестированы на структуре вашей базы данных и соответствуют условиям лабораторной работы.