2015-03-13 2 views
-1

Я хранящие данные, как это:Выберите строки MySQL из в течение 10 минут

Time - Date 
13:20:20 - 2015-03-13 

Я хочу, чтобы выбрать записи MySQL из в течение 10 минут. Поэтому, если я исполню его 13:00, это будет 12: 50-13: 00.

Я потратил много времени на изучение функции -interval x минут (теперь) и т. Д., Она просто не работает ... Возможно, я плохо хранил данные (тип varchar) или TimeZones проблемы с сервера провайдера

Я думал что-то вроде SELECT WHERE Time < - 60 seconds AND Date = '2015-03-13'

Но это просто не работает. Вся помощь здесь ценится.

+2

'где (datetimefield> (now() - INTERVAL 10 MINUTE))'. И да, если вы используете varchars для своих дат, вы сохраняете свои даты HORRIBLY. –

+0

Это НЕ работает. Я получаю такое же количество строк, независимо от того, изменю ли интервал до 100 минут или 10.000. Появится намного больше информации. – Gruffer

+0

Да, потому что ваши даты являются varchars. mysql, вероятно, преобразует их, чтобы установить дату/время. ваша ПЕРВАЯ задача - переделать таблицы и использовать правильные типы даты/даты. –

ответ

0

Так вы это и делаете. Теперь не делай этого. Серьезно, посмотрите, как это сделать ниже, но вернитесь и измените способ хранения дат как столбца типа даты. Это облегчает вашу жизнь, и каждый, кто наследует приложение от вас (даже если это будет разумнее вас через год), не будет ненавидеть вас за то, что они делают дополнительную работу.

create table mytmp 
(
    mydate varchar(10), 
    mytime varchar(8) 
); 

insert into mytmp 
values ('2015-01-01', '01:23:45'); 
insert into mytmp 
values ('2015-01-01', '01:24:45'); 
insert into mytmp 
values ('2015-01-01', '01:25:45'); 


select * 
from mytmp 
where STR_TO_DATE(CONCAT(mydate, ' ', mytime), "%Y-%m-%d %H:%i:%S") > (now() - INTERVAL 10 minute); 

select * 
from mytmp 
where STR_TO_DATE(CONCAT(mydate, ' ', mytime), "%Y-%m-%d %H:%i:%S") > (now() - INTERVAL 1 year); 

drop table my tmp; 

Ключевым битом является получение даты строки в формате даты и времени с использованием STR_TO_DATE. STR_TO_DATE требует формат набора, чтобы он мог интерпретировать, какие части строки представляют, какие части типа datetime (минуты, дни, годы и т. Д.), Поэтому вам нужно указать строку формата. Я использовал функцию CONCAT для объединения столбцов даты и времени в одну строку для этого. Теперь операции INTERVAL будут работать, когда вы сравниваете похожие или совместимые типы.

Вы можете найти строки форматирования для MySQL здесь: http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_date-format)

Edit: Строка формата вы хотите '% H:% I:% s -% Y-% m-% d' по внешности.

+0

Я также должен добавить, что если вы не можете измените приложение на использование соответствующего столбца, тогда вы можете захотеть создать представление, которое использует STR_TO_DATE для вычисления правильного столбца datetime для операций чтения, не связанных с устаревшим приложением. – yoshiwaan

Смежные вопросы