2016-11-30 2 views
1

У меня есть delivery slots, который имеет столбец from (datetime).Как получить строки между временными интервалами

Слоты для хранения хранятся в течение 1 часа до 1 часа и 30-минутных интервалов, ежедневно. т.е. 3:00 утра-4:30 утра, 6:00 утра-7:30 утра, 9:00 утра-10:30 утра и так далее

id |  from   
------+--------------------- 
    1 | 2016-01-01 03:00:00 
    2 | 2016-01-01 04:30:00 
    3 | 2016-01-01 06:00:00 
    4 | 2016-01-01 07:30:00 
    5 | 2016-01-01 09:00:00 
    6 | 2016-01-01 10:30:00 
    7 | 2016-01-01 12:00:00 
    8 | 2016-01-02 03:00:00 
    9 | 2016-01-02 04:30:00 
    10 | 2016-01-02 06:00:00 
    11 | 2016-01-02 07:30:00 
    12 | 2016-01-02 09:00:00 
    13 | 2016-01-02 10:30:00 
    14 | 2016-01-02 12:00:00 

Я пытаюсь получить все delivery_slots между часами 3:00 утра - 4.30 утра. Ive получил следующий до сих пор:

SELECT * FROM delivery_slots WHERE EXTRACT(HOUR FROM delivery_slots.from) >= 3 AND EXTRACT(MINUTE FROM delivery_slots.from) >= 0 AND EXTRACT(HOUR FROM delivery_slots.from) <= 4 AND EXTRACT(MINUTE FROM delivery_slots.from) <= 30; 

Какие любопытное работы. Kinda, потому что это только возврат слотов доставки, которые имеют минуты 00.

Это потому, что последнего where условия (EXTRACT(MINUTE FROM delivery_slots.from) <= 30)

Чтобы дать вам представление о том, что я пытаюсь ожидать:

id |  from   
-------+--------------------- 
    1 | 2016-01-01 03:00:00 
    2 | 2016-01-01 04:30:00 
    8 | 2016-01-02 03:00:00 
    9 | 2016-01-02 04:30:00 
    15 | 2016-01-03 03:00:00 
    16 | 2016-01-03 04:30:00 
      etc... 

Есть ли лучший способ пойти по этому поводу?

+0

'потому что он только возвращает слоты для доставки, у которых есть минуты 00' ... Я просто тестировал локально на Postgres, используя ваши данные, и он возвращал нужные вам данные. –

ответ

1

Попробуйте это: (не проверено)

SELECT * FROM delivery_slots WHERE delivery_slots.from::time >= '03:00:00' AND delivery_slots.from::time <= '04:30:00' 

Надеюсь, это поможет.
Cheers.

1

Самый простой способ сделать это, на мой взгляд, чтобы бросить from столбец как тип time и сделать где >= и <=, как и

select * from testing where (date::time >= '3:00'::time and date::time <= '4:30'::time);