#mysql #sql #database
#mysql #sql #База данных
Вопрос:
В моей базе данных у меня есть таблица ‘leads’ со столбцом ‘datum_event’ (varchar). Мне нужно получить строки между ‘from’ и ‘to’ datum_event. Например, с 30.11.2018 по 31.03.2019. Я использую str_to_date для преобразования переменной в дату для сравнения.
Мой sql:
SELECT DISTINCT(l.lead_id)
FROM leads as l
WHERE STR_TO_DATE(datum_event,'%d.%m.%y') >= STR_TO_DATE('30.11.2018','%d.%m.%y')
AND STR_TO_DATE(datum_event,'%d.%m.%y') <= STR_TO_DATE('31.03.2019','%d.%m.%y')
ORDER BY l.lead_id desc
Но теперь я получаю пустой результат. Это неправильно. Есть строка с datum_event ‘01.12.2018’, но я не вижу ее в результате.
Я могу видеть результат, если сравнивать даты за один год, например, с 01.01.2019 по 31.03.2019, но если я сравниваю с 31.12.2018, я не вижу никакого результата.
Пожалуйста, помогите мне, как я могу это решить? Спасибо.
Комментарии:
1. DISTINCT — это не функция, это часть
SELECT DISTINCT
! Пропустите эти дополнительные круглые скобки и просто напишитеSELECT DISTINCT l.lead_id FROM leads ...
, чтобы сделать код понятнее!2. Понятно. Но это не решает мою проблему
3. Также необходимо получить данные, например, только с ‘31.12.2018’ или только с ‘31.03.2019’
4. Используйте правильные типы данных. Никогда не храните даты и т.д. В символьных столбцах.
5. Попробуйте
SELECT l.lead_id, STR_TO_DATE(datum_event,'%d.%m.%y'), STR_TO_DATE('30.11.2018','%d.%m.%y') from leads as l
. Получаете ли вы результат, который имеет смысл?
Ответ №1:
Возможно, вы можете использовать условие SQL BETWEEN
.
SELECT DISTINCT(l.lead_id)
FROM leads as l
WHERE (STR_TO_DATE(datum_event,'%d.%m.%y') BETWEEN
STR_TO_DATE('30.11.2018','%d.%m.%y') AND STR_TO_DATE('31.03.2019','%d.%m.%y'))
ORDER BY l.lead_id desc`
Ответ №2:
select STR_TO_DATE('30.11.2018','%d.%m.%y')
он вернет 2020-11-30, но вам нужна 2018-11-30
эта дата, поэтому вам нужно изменить формат, как показано ниже
select STR_TO_DATE('30.11.2018','%d.%m.%Y') this will `2018-11-30`
я добавил формат даты в качестве демонстрационнойссылки
итак, в вашем запросе вам нужно исправить свой формат
SELECT l.lead_id
FROM leads as l
WHERE STR_TO_DATE(datum_event,'%d.%m.%Y') >= STR_TO_DATE('30.11.2018','%d.%m.%Y')
AND STR_TO_DATE(datum_event,'%d.%m.%Y') <= STR_TO_DATE('31.03.2019','%d.%m.%Y')
ORDER BY l.lead_id desc
Комментарии:
1. @Ingus >= и <= работают как между собой, так что здесь нет никакого подвоха
2. @Ingus это другой вопрос