Mysql корректно сравнивает даты

#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 это другой вопрос