如何在时间间隔之间获取行

时间:2016-11-30 05:09:42

标签: postgresql postgresql-9.3

我的delivery slots列有fromdatetime

每天以1小时至1小时30分钟的间隔存储交货时段。 即3.00am-4.30am,6.00am-7.30am,9.00am-10.30am等等

  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 

我想在凌晨3点到凌晨4点半之间获得所有delivery_slots。到目前为止,我得到了以下内容:

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;

哪种有点有效。有点,因为它只返回分钟为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...

有没有更好的方法来解决这个问题?

2 个答案:

答案 0 :(得分:1)

在我看来,最简单的方法是将from列转换为类型time并执行>=<=,如此

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

答案 1 :(得分:1)

试试这个:(未经测试)

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

希望这有帮助。
欢呼声。