← К оглавлению занятия

Занятие 11. Практикум 3

📁 Блок: SQL / MySQL / Практикум ⏱️ Время изучения: ~90 мин 🎯 Сложность: Начальная
#now #curdate #dayname #dayofweek #date_add #date_sub #datediff #last_day #year #cast #char

⚡ Кратко: суть темы

Практикум закрепляет работу с датами, временем и преобразованием типов. Десять задач на текущую дату, день недели, интервалы, разницу между датами и явное приведение к строке.

  • NOW(), CURDATE() — текущие дата и время.
  • DAYNAME, DAYOFWEEK — день недели.
  • DATE_ADD, DATE_SUB, DATEDIFF — вычисления с датами.
  • CAST(... AS CHAR) — явное преобразование в строку.

Что запомнить: практикума хватит, чтобы уверенно читать и писать запросы с датами.

Частая ошибка: в MySQL DAYOFWEEK считает воскресенье первым днём (1), а субботу — седьмым (7).

📖 Текущая дата и время

Для получения текущего момента используются функции NOW(), CURDATE() и CURTIME().

SELECT NOW() AS current_date_time;   -- 2024-08-30 14:25:00
SELECT CURDATE() AS current_date;     -- 2024-08-30
SELECT CURTIME() AS current_time;     -- 14:25:00

📖 День недели

В MySQL есть два удобных способа получить день недели:

  • DAYNAME(date) — название дня на английском, например Friday.
  • DAYOFWEEK(date) — номер дня недели: 1 = воскресенье, 7 = суббота.
SELECT id, order_date, DAYNAME(order_date) AS day_of_week
FROM orders;

SELECT id, order_date, DAYOFWEEK(order_date) AS day_number
FROM orders;

Проверить по документации: в некоторых СУБД нумерация дней недели начинается с понедельника. В MySQL DAYOFWEEK начинает с воскресенья.

📖 Интервалы: прибавление и вычитание дней

Функции DATE_ADD и DATE_SUB принимают выражение INTERVAL value unit.

-- Прибавить 30 дней к дате заказа
SELECT id, order_date,
       DATE_ADD(order_date, INTERVAL 30 DAY) AS new_order_date
FROM orders;

-- Дата через 100 дней от текущей
SELECT DATE_ADD(CURDATE(), INTERVAL 100 DAY) AS date_in_100_days;

-- Дата 15 дней назад
SELECT DATE_SUB(CURDATE(), INTERVAL 15 DAY) AS date_15_days_ago;

📖 Разница между датами

DATEDIFF(date1, date2) возвращает количество дней между двумя датами (результат = date1 - date2).

SELECT id, order_date, shipped_date,
       DATEDIFF(shipped_date, order_date) AS days_to_ship
FROM orders;

📖 Явное преобразование в строку

В MySQL для преобразования числа или даты в строку используется CAST(expression AS CHAR). Важно: VARCHAR(n) в CAST не поддерживается, используйте CHAR(n).

SELECT CAST(id AS CHAR(10)) AS id_as_string
FROM customers;

✨ Советы по практикуму

  • Выполняйте запросы по одному и сверяйте результат с ожидаемым.
  • Обращайте внимание на тип возвращаемого значения: дата, число или строка.
  • Если результат с DAYOFWEEK кажется странным, проверьте нумерацию дней.