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

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

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

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

Ошибка: неверный тип данных

Хранение денег в FLOAT приводит к погрешностям округления. Даты как строки не позволяют использовать функции дат.

-- Плохо
CREATE TABLE orders (total FLOAT, order_date VARCHAR(10));

-- Хорошо
CREATE TABLE orders (total DECIMAL(10, 2), order_date DATE);
2

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

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

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

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

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

DAYOFWEEK в MySQL: 1 — воскресенье, 7 — суббота. Пятница — 6, а не 5.

-- Неправильно
SELECT * FROM orders WHERE DAYOFWEEK(order_date) = 5;

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

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

DATEDIFF(date1, date2) = date1 - date2.

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

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

Ошибка: слепая надежда на скрытые преобразования

MySQL может автоматически преобразовывать строки в числа, но в других СУБД запрос вызовет ошибку. Для переносимости используйте CAST.

-- Работает в MySQL, но плохо переносится
SELECT '100' + 50;

-- Переносимо
SELECT CAST('100' AS SIGNED) + 50;