← К оглавлению занятия
⚡ Кратко: ошибки
- Неправильный тип данных для задачи.
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;