2015-03-24 3 views
0

Предположим, у меня есть таблица, содержащая данные транзакции месяца с transaction_time, хранящиеся в поле DATETIME.Получение данных за тот же период времени

Я хочу получить все транзакции, которые произошли между 12:00:00 и 13:00:00, независимо от дня. WHERE transaction_time BETWEEN x AND y должен быть специфичным для даты, но мне нужен тот же период времени для всех дат.

Как я могу фильтровать такой диапазон в запросе MySQL?

+1

Вы должны отредактировать вопрос с образцами данных, желаемых результатов, и ваши собственные попытки решить эту проблему. –

ответ

1

Вы можете фильтровать результат применения HOUR() функции MySQL к вашему DATETIME значению:

WHERE HOUR(transaction_time) = 12 

Если вам нужно фильтровать по более точным временным диапазонам, вы можете конвертировать раз секунды следующим образом:

WHERE TIME_TO_SEC(TIME(transaction_time)) BETWEEN TIME_TO_SEC('12:00:00') 
               AND TIME_TO_SEC('13:00:00') 
0

Вы можете использовать:

select * from transactions 
where convert(time, transaction_time) between '12:00:00' and '13:00:00' 

для MSSQL и:

select * from transactions 
where extract(hour_second from transaction_time) between 120000 and 130000 

для MySql.

+0

Они будут охватывать «12: 00: 00» до «13: 59: 59'. – eggyal

+0

Вы правы - я меняю его на правильную работу. –

0

У вас есть два ограничения по времени. Первый заключается в том, чтобы ограничить даты определенным месяцем. Предположим, мы получили первый день месяца в качестве параметра даты:

where transaction_time >= :searchMonth 
    and transaction_time < Date_Add(:searchMonth, interval 1 month) 

Теперь мы смотрим только на строки из этого месяца. Теперь ограничьте его указанным часом. Предположим, что мы получаем час как целочисленный параметр:

and extract(hour from transaction_time) between :hr and (:hr + 1) 

Теперь эта заключительная часть основана на вашем собственном коде. Позволь мне сказать, что, когда требования чтения «в течение определенного времени суток», и запрос читает «во время полуденного часа», то я обыкновение писать так:

and extract(hour from transaction_time) >= :hr 
    and extract(hour from transaction_time) < (:hr + 1) 

потому, что час 13 (1 вечер) это первый щелчок следующего часа. Поэтому, если время транзакции составляет ровно 13:00:00, и вы используете between, тогда он будет отображаться при просмотре часов в полдень, а также при просмотре 1 часа в час. Это НЕ является желаемым результатом. Вы можете проверить это со своим аналитиком.

Так полный фильтр, как я бы написать, это:

where transaction_time >= :searchMonth 
    and transaction_time < Date_Add(:searchMonth, interval 1 month) 
    and extract(hour from transaction_time) >= :hr 
    and extract(hour from transaction_time) < (:hr + 1) 
Смежные вопросы