Получение оператора SELECT для работы с STR_TO_DATE

У меня есть даты, хранящиеся в виде строк в таблице (имя столбца — «log_event») — да, я знаю, что это должен быть реальный тип даты, — но я работаю с существующей таблицей, которую я не создавал, и т. д.

Во всяком случае, даты в столбце в виде

'08/14/2014 1:01 am' (or pm)

Я действительно просто пытаюсь получить SELECT на основе части строки с датой (мне все равно, сколько времени для целей моего SELECT, мне просто нужны все строки, которые имеют дату между, скажем, date1 и date2) , и я пробовал:

SELECT * FROM db_event_log WHERE STR_TO_DATE(log_event,'%m/%d/%Y') > STR_TO_DATE('08/01/2014', '%m/%d/%Y')

но мой SELECT возвращает NULL

(Да, я знаю, что это не ВЫБОР между двумя датами - я просто пытаюсь построить строку запроса шаг за шагом, чтобы убедиться, что я все сделал правильно, прежде чем пытаться перейти на следующий уровень)

Я также пытался отформатировать время, выполнив:

SELECT * FROM db_event_log WHERE STR_TO_DATE(log_event,'%m/%d/%Y %l:%i %p') > STR_TO_DATE('08/01/2014 12:00 am', '%m/%d/%Y %l:%i %p')

который также возвращает выбор NULL.

Где я ошибаюсь?


person TDU    schedule 29.09.2014    source источник
comment
У меня работает: sqlfiddle.com/#!2/59da0/1 Возможно, ваши данные не в том формате, который вы ожидаете.   -  person Moob    schedule 29.09.2014
comment
ДОХ!! Опечатка в названии поля. Извините, я чувствую себя таким глупым в этот момент. Должно было быть log_event1. шиш.   -  person TDU    schedule 29.09.2014
comment
Однако Moob - ваш код был именно тем, что я искал. Выберите одну из двух дат. Работает просто отлично. Спасибо большое!   -  person TDU    schedule 29.09.2014
comment
Moob — поместите свой пример кода на мою тестовую страницу — отлично работает!   -  person TDU    schedule 29.09.2014
comment
Рад помочь. Хотя я ценю вашу благодарность, обратите внимание, что комментарии — это не место для благодарностей или чата. Если вы считаете, что ответ полезен и хорошо изучен, вы должны проголосовать за него. Если вы считаете, что ответ является лучшим решением вашей проблемы, вы можете пометить его как принятый ответ, если хотите. Дополнительные сведения см. на странице stackoverflow.com/help/someone-answers.   -  person Moob    schedule 29.09.2014


Ответы (2)


Попробуй это:

 DATE(STR_TO_DATE(log_event,  '%m/%d/%Y %l:%i %p'))

STR_TO_DATE() возвращает NULL, когда он не может понять всю свою входную строку, поэтому я предлагаю вам интерпретировать все это, а затем использовать DATE() для получения части даты.

Вы также можете выбрать диапазон дат, не получая часть даты из каждой из ваших текстовых временных меток. Это позволит получить вчерашние записи, например

 WHERE STR_TO_DATE(log_event,  '%m/%d/%Y %l:%i %p') >= DATE(NOW()) - INTERVAL 1 DAY
   AND STR_TO_DATE(log_event,  '%m/%d/%Y %l:%i %p') <  DATE(NOW())

Кстати, эта настойчивость в возвращении NULL может быть полезна, когда вы очищаете свои данные. При устранении неполадок вы можете дать команду, подобную этой, чтобы найти строки даты, которые не имеют смысла.

 SELECT whatever FROM table WHERE STR_TO_DATE(log_event,  '%m/%d/%Y %l:%i %p') IS NULL

и вы увидите свои «плохие» данные.

person O. Jones    schedule 29.09.2014

Ваш код работает для меня...

Я установил следующую схему на sqlfiddle.com:

CREATE TABLE db_event_log (
    id INT(11) NOT NULL AUTO_INCREMENT,
    log_event VARCHAR(30) NOT NULL,
    PRIMARY KEY (id)
);

INSERT INTO db_event_log (log_event) 
VALUES ('07/14/2014 1:01 am'),
       ('08/14/2014 1:01 am'),
       ('09/14/2014 9:01 pm');  

... затем запустил ваш запрос:

SELECT * FROM db_event_log 
WHERE STR_TO_DATE(log_event,'%m/%d/%Y') > STR_TO_DATE('08/01/2014', '%m/%d/%Y')

... который вернул:

ID  LOG_EVENT
2   08/14/2014 1:01 am
3   09/14/2014 9:01 pm

http://sqlfiddle.com/#!2/59da0/1

Получение результатов между двумя датами

Чтобы получить результаты между двумя датами, вы можете использовать MySQL BETWEEN оператор. НАПРИМЕР:

SELECT * FROM db_event_log 
WHERE STR_TO_DATE(log_event,'%m/%d/%Y') 
BETWEEN STR_TO_DATE('08/01/2014', '%m/%d/%Y') AND STR_TO_DATE('09/01/2014', '%m/%d/%Y')

http://sqlfiddle.com/#!2/cc7681/1

person Moob    schedule 29.09.2014