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

🐛 Типичные ошибки

⚡ Кратко: ошибки

  • DAYOFWEEK считает воскресенье первым днём.
  • Путать порядок аргументов в DATEDIFF.
  • Использовать VARCHAR в CAST вместо CHAR.
  • Забывать, что DAYNAME возвращает английские названия.
1

Ошибка: неверная нумерация дней недели

В MySQL DAYOFWEEK возвращает 1 для воскресенья, а не для понедельника. Поэтому пятница — 6, а не 5.

-- Неправильно: 5 — четверг в MySQL
SELECT id, order_date FROM orders WHERE DAYOFWEEK(order_date) = 5;

-- Правильно
SELECT id, order_date FROM orders WHERE DAYOFWEEK(order_date) = 6;
2

Ошибка: перепутанный порядок в DATEDIFF

DATEDIFF(date1, date2) возвращает date1 - date2. Если перепутать, получите отрицательные значения.

-- Неправильно: отрицательные дни
SELECT DATEDIFF(order_date, shipped_date) FROM orders;

-- Правильно
SELECT DATEDIFF(shipped_date, order_date) FROM orders;
3

Ошибка: CAST(... AS VARCHAR) в MySQL

MySQL не поддерживает VARCHAR внутри CAST. Используйте CHAR.

-- Ошибка
SELECT CAST(id AS VARCHAR(10)) FROM customers;

-- Правильно
SELECT CAST(id AS CHAR(10)) FROM customers;
4

Ошибка: ожидание русских названий от DAYNAME

DAYNAME возвращает название дня на английском. Для русского языка используйте DATE_FORMAT(..., '%W') с SET lc_time_names = 'ru_RU'.

SET lc_time_names = 'ru_RU';
SELECT id, order_date, DATE_FORMAT(order_date, '%W') AS day_of_week
FROM orders;
5

Ошибка: вычитание дат как строк

Если столбец хранится как строка, арифметика с датами не сработает или даст непредсказуемый результат.

-- Опасно: order_date может быть строкой
SELECT DATEDIFF(shipped_date, order_date) FROM orders;

-- Безопаснее: привести к DATE
SELECT DATEDIFF(CAST(shipped_date AS DATE), CAST(order_date AS DATE)) FROM orders;