В таблице событий поле event_date_text хранит дату как текст в формате YYYY-MM-DD. Вы хотите фильтровать строки за прошлую неделю и группировать по неделе. Что логичнее всего сделать в запросе?
AСравнивать строки напрямую и использовать
LIKE '2025-12-%' для группировки по периодуBПривести к типу даты:
CAST(event_date_text AS date) или event_date_text::date для функций датCИспользовать
EXTRACT(week FROM event_date_text) напрямую от строки, не приводя к dateDЗаменить дефисы в строке через
REPLACE(event_date_text, '-', '') для последующей работыПравильный ответ. Если дальше нужны операции с датами, лучше явно привести текст к типу
date, а не оставлять строкой.Разбор
Даже если строковые даты иногда сравниваются «правильно», это всё равно строковый тип: функции дат, группировки по периодам и проверки корректности формата становятся ненадёжными. Явный каст в date через CAST(... AS date) или ... ::date делает логику запроса прозрачной и позволяет использовать DATE_TRUNC, EXTRACT и арифметику дат. Сравнение строк через LIKE хрупко к смене формата, а EXTRACT напрямую от текста не работает в большинстве СУБД.
Проверь себя · 1/3разбор после ответа
В таблице
products код товара хранится как текст, например 00123 (важны ведущие нули). Вы хотите соединить её с catalog(code) (тоже текст). Какое действие чаще всего приводит к багу и пропущенным совпадениям?Ещё вопросы по теме «Строки и приведение типов»
- У вас есть таблицы `users(email)` и `marketing_signups(email)`. В одной системе email сохраняется как `Ivan@Example.com`, в другой — `ivan@example.com`. Какой подход в `JOIN` чаще всего решает проблему без изменения данных в таблицах?
- В таблице `products` категория хранится как `Books`, `books`, `BOOKS`. Нужно одним условием в `WHERE` отобрать все варианты категории «книги». Какой фильтр наиболее надёжен?
- В отчёте по городам вы делаете агрегацию по `city`, но видите две строки: `Moscow` и `Moscow ` (с пробелом в конце). Как исправить это прямо в запросе?
- Поле `price_text` хранит цены как текст: `2`, `10`, `100`. Аналитик написал `WHERE price_text > '10'` и получил неожиданный набор строк. Как сделать сравнение числовым?
- В `amount_text` суммы записаны как текст, но иногда встречается пустая строка `''`. Запрос `SUM(CAST(amount_text AS int))` падает. Какое выражение чаще всего решает проблему, превращая пустые строки в `NULL` перед приведением типа?
- Все вопросы по «Строки и приведение типов» →