mysql: между не работает с датой

Я пишу между запросом с отформатированной датой. Это мой запрос:


ВЫБЕРИТЕ shop_id, date_format(registered_time,'%d-%m-%Y') как дату из магазинов, где (date_format(registered_time,'%d-%m-%Y') МЕЖДУ '09-03-2016' И '19 -04-2016')


Однако, когда я выполняю запрос, он дает только записи между датами 09 и 19, независимо от месяца. Например, у меня есть такие записи, как 30-03-2016, 31-03-2016... но они игнорируются.

Если кто-то может найти что-нибудь из этого, пожалуйста, скажите мне..

Еще одна вещь заключается в том, что я конвертирую эту дату из поля отметки времени. Я надеюсь, что это не вызывает никаких проблем.


person Archit    schedule 20.04.2016    source источник
comment
Вы сравниваете строки, а не даты. И «30..» не находится между «09..» и «19..».   -  person Paul Spiegel    schedule 20.04.2016
comment
Я использую тот же формат для сравнения результатов, в этом нет проблем. Какие даты у вас есть в столбце таблицы   -  person shzyincu    schedule 20.04.2016


Ответы (3)


Вам нужно превратить ваши строки обратно в даты, которые понимает MySQL. Из документации:

CAST(datetime_col AS DATE)

должно помочь выполнить то, что вы хотите.

Справочник

person Jacob See    schedule 20.04.2016
comment
Однако CAST() вряд ли поймет формат DD-MM-YYYY. - person Pekka; 20.04.2016

Вы не можете взять две произвольные строки (например, 30-03-2016) и ожидать, что BETWEEN будет вести себя так же, как и для реальных столбцов DATE (поведение, жестко закодированное в mySQL).

Вам нужно использовать реальные значения DATE, чтобы BETWEEN работало правильно.

  • Если столбцов уже DATE столбцов, просто пропустите форматирование:

    SELECT shop_id, registered_time FROM shops where registered_time 
    BETWEEN '2016-03-09' AND '2016-04-19'
    

Если ваши существующие столбцы имеют формат DD-MM-YYYY, преобразуйте их в даты, используя STR_TO_DATE() - либо на лету только для целей этого запроса (sloooowwwww!), либо постоянно.

person Pekka    schedule 20.04.2016

Вы должны вернуть дату строки register_time на дату, как показано ниже.

STR_TO_DATE(DATE_FORMAT(registered_time,'%d/%m/%Y'),'%d/%m/%Y') МЕЖДУ STR_TO_DATE('03-09-2016','%d/%m/ %Y') И STR_TO_DATE('19-04-2016','%d/%m/%Y')

Это сработало для меня.

person Madhawa Madhuranga    schedule 03.07.2020