Загрузка данных
Лабораторная работа «Даты и время»
1. Теоретическая часть.
Основные типы данных для хранения времени:
Тип Что хранит Пример
DATE Только дата 2025-04-15
TIME Только время 14:30:30
DATETIME Дата и время 2025-04-15 14:30:00
TIMESPAMP Дата и время с учетом
часового пояса
2025-04-15 14:30:00
Полезные функции:
Функция Что делает Пример
NOW() Текущая дата и
время
2025-04-15 15:20:00
CURDATE() Текущая дата 2025-04-15
CURTIME() Текущее время 15:20:00
YEAR(date) ,
MONTH(date) ,
DAY(date)
Извлечение
компонентов
YEAR('2025-04-15') → 2025
DATE_FORMAT(date,
format)
Форматирование
даты в строку
DATE_FORMAT(NOW(),
'%d.%m.%Y') → 15.04.2025
DATEDIFF(date1, date2) Разница в днях DATEDIFF('2025-04-15', '2025-
04-10') → 5
TIMESTAMPDIFF(unit,
start, end)
Разница в
заданных
единицах
TIMESTAMPDIFF(HOUR,
'2025-04-15 10:00', '2025-04-15
14:00') → 4
DATE_ADD(date,
INTERVAL value unit)
Добавление
интервала
DATE_ADD('2025-04-15',
INTERVAL 7 DAY) → 2025-
04-22
DATE_SUB(date,
INTERVAL value unit)
Вычитание
интервала
DATE_SUB('2025-04-15',
INTERVAL 1 MONTH) →
2025-03-15
LAST_DAY(date) Последний день
месяца
LAST_DAY('2025-04-15') →
2025-04-30
2. Пример выполнения заданий
1 задание
Выведите список вех пользователей добавив столбцы год регистрации
(reg_year), месяц регистрации числом (reg_month), день недели регистрации.
SELECT
name,
registered_at,
YEAR(registered_at) AS reg_year,
MONTH(registered_at) AS reg_month,
DAYNAME(registered_at) AS reg_weekday
FROM users;
2 задание
Найдите все заказы, сделанные в марте 2025 года.
SELECT * FROM orders
WHERE created_at >= '2025-03-01' AND created_at < '2025-04-01';
3 задание
Найдите всех пользователей, которые зарегистрировались в последние 30
дней (относительно текущей даты).
SELECT * FROM users
WHERE registered_at >= CURDATE() - INTERVAL 30 DAY;
4 задание
Выведите заказы за сегодняшний день (учитывая, что в created_at есть
время).
SELECT * FROM orders
WHERE DATE(created_at) = CURDATE();
5 задание
Для каждого пользователя посчитайте, сколько дней прошло с момента его
регистрации до сегодняшнего дня.
SELECT
name,
registered_at,
DATEDIFF(CURDATE(), registered_at) AS days_since_reg
FROM users;
6 задание
Для каждого заказа посчитайте, сколько дней прошло между регистрацией
пользователя и датой заказа.
SELECT
u.name,
o.amount,
o.created_at AS order_date,
u.registered_at AS reg_date,
DATEDIFF(o.created_at, u.registered_at) AS days_to_order
FROM orders o
JOIN users u ON o.user_id = u.id;
7 задание
Выведите список заказов, где дата отображается в формате ДД.ММ.ГГГГ
ЧЧ:МИ.
SELECT
id,
user_id,
amount,
DATE_FORMAT(created_at, '%d.%m.%Y %H:%i') AS formatted_date
FROM orders;
8 задание
Посчитайте общую сумму заказов (total_amount) и количество заказов
(order_count) для каждого месяца 2025 года.
SELECT
DATE_FORMAT(created_at, '%Y-%m') AS month,
COUNT(*) AS order_count,
SUM(amount) AS total_amount
FROM orders
WHERE YEAR(created_at) = 2025
GROUP BY DATE_FORMAT(created_at, '%Y-%m')
ORDER BY month;
9 задание
Найдите пользователя, который сделал первый заказ в 2025 году.
SELECT u.name, o.created_at
FROM orders o
JOIN users u ON o.user_id = u.id
WHERE YEAR(o.created_at) = 2025
ORDER BY o.created_at ASC
LIMIT 1;
Задание.
1. Вывести список всех сотрудников, добавив столбцы: год найма, месяц
найма числом, день недели найма (числом от 0 до 6, где 0 — понедельник).
2. Посчитать, сколько сотрудников было нанято в каждом месяце, и
отсортировать по количеству от большего к меньшему.
3. Найти все записи о посещениях за 11 апреля 2025 года.
4. Найти всех сотрудников, нанятых в последние 60 дней (относительно
текущейдаты).
5. Вывести сотрудников, у которых сегодня нет отметки о выходе
(поле check_out пустое), с указанием времени входа.
6. Для каждого сотрудника посчитать количество полных месяцев,
проработанных в компании (от даты найма до сегодняшнего дня).
7. Для каждой записи посещения посчитать продолжительность рабочего
дня в часах с одним знаком после запятой; если check_out отсутствует —
вывести NULL.
8. Вывести список посещений, где дата входа отображается в
формате ДД.ММ.ГГГГ, а время входа — в формате ЧЧ:МИ.
9. Вывести информацию о сотруднике в виде строки: "Фамилия Имя
Отчество работает с дд месяц гггг года".
10. Посчитать общее количество отработанных часов для каждого
сотрудника за апрель 2025 года (учитывать только завершённые рабочие дни)
и отсортировать по убыванию часов.
11. Найти сотрудника, который пришёл сегодня на работу раньше всех.
база данных для работы:
-- phpMyAdmin SQL Dump
-- version 5.2.0
-- https://www.phpmyadmin.net/
--
-- Хост: 127.0.0.1:3306
-- Время создания: Апр 15 2026 г., 11:46
-- Версия сервера: 10.8.4-MariaDB
-- Версия PHP: 8.1.9
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
START TRANSACTION;
SET time_zone = "+00:00";
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8mb4 */;
--
-- База данных: `work`
--
-- --------------------------------------------------------
--
-- Структура таблицы `attendance`
--
CREATE TABLE `attendance` (
`id` int(11) NOT NULL,
`employee_id` int(11) NOT NULL,
`check_in` datetime NOT NULL,
`check_out` datetime DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
--
-- Дамп данных таблицы `attendance`
--
INSERT INTO `attendance` (`id`, `employee_id`, `check_in`, `check_out`) VALUES
(1, 1, '2025-04-10 08:55:00', '2025-04-10 17:05:00'),
(2, 1, '2025-04-11 09:10:00', '2025-04-11 18:20:00'),
(3, 1, '2025-04-14 08:45:00', '2025-04-14 17:00:00'),
(4, 1, '2025-04-15 09:00:00', NULL),
(5, 2, '2025-04-10 09:30:00', '2025-04-10 18:00:00'),
(6, 2, '2025-04-11 09:15:00', '2025-04-11 17:45:00'),
(7, 2, '2025-04-14 10:00:00', '2025-04-14 16:30:00'),
(8, 3, '2025-04-10 08:00:00', '2025-04-10 16:00:00'),
(9, 3, '2025-04-11 08:10:00', '2025-04-11 17:00:00'),
(10, 3, '2025-04-14 07:50:00', '2025-04-14 15:45:00'),
(11, 3, '2025-04-15 08:05:00', '2025-04-15 16:30:00'),
(12, 4, '2025-04-10 10:15:00', '2025-04-10 19:00:00'),
(13, 4, '2025-04-11 09:45:00', '2025-04-11 18:30:00'),
(14, 4, '2025-04-14 10:30:00', '2025-04-14 17:45:00'),
(15, 5, '2025-04-10 09:00:00', '2025-04-10 18:00:00'),
(16, 5, '2025-04-11 08:30:00', '2025-04-11 17:30:00');
-- --------------------------------------------------------
--
-- Структура таблицы `employees`
--
CREATE TABLE `employees` (
`id` int(11) NOT NULL,
`full_name` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL,
`position` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL,
`hire_date` date NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
--
-- Дамп данных таблицы `employees`
--
INSERT INTO `employees` (`id`, `full_name`, `position`, `hire_date`) VALUES
(1, 'Иванов Сергей Петрович', 'Разработчик', '2024-11-01'),
(2, 'Петрова Анна Владимировна', 'Менеджер', '2025-01-15'),
(3, 'Сидоров Алексей Иванович', 'Тестировщик', '2025-02-01'),
(4, 'Козлова Елена Дмитриевна', 'Дизайнер', '2025-03-10'),
(5, 'Николаев Дмитрий Сергеевич', 'Разработчик', '2025-04-01');
--
-- Индексы сохранённых таблиц
--
--
-- Индексы таблицы `attendance`
--
ALTER TABLE `attendance`
ADD PRIMARY KEY (`id`),
ADD KEY `employee_id` (`employee_id`);
--
-- Индексы таблицы `employees`
--
ALTER TABLE `employees`
ADD PRIMARY KEY (`id`);
--
-- AUTO_INCREMENT для сохранённых таблиц
--
--
-- AUTO_INCREMENT для таблицы `attendance`
--
ALTER TABLE `attendance`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=17;
--
-- AUTO_INCREMENT для таблицы `employees`
--
ALTER TABLE `employees`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=6;
--
-- Ограничения внешнего ключа сохраненных таблиц
--
--
-- Ограничения внешнего ключа таблицы `attendance`
--
ALTER TABLE `attendance`
ADD CONSTRAINT `attendance_ibfk_1` FOREIGN KEY (`employee_id`) REFERENCES `employees` (`id`);
COMMIT;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;