如果有些午夜时间,我如何确保postgresql记录介于给定的开始和结束时间之间?

时间:2016-12-05 20:38:23

标签: sql postgresql

我有一张场地表

# == Schema Information
#
# Table name: venues
#
#  id                          :integer          not null, primary key
#  name                        :string           default(""), not null
#  address_1                   :string           default(""), not null
#  address_2                   :string
#  city                        :string           default(""), not null
#  county                      :string           default(""), not null
#  postal_code                 :string           default(""), not null
#  mon_start                   :time
#  mon_end                     :time
#  tue_start                   :time
#  tue_end                     :time
#  wed_start                   :time
#  wed_end                     :time
#  thu_start                   :time
#  thu_end                     :time
#  fri_start                   :time
#  fri_end                     :time
#  sat_start                   :time
#  sat_end                     :time
#  sun_start                   :time
#  sun_end                     :time
#  created_at                  :datetime         not null
#  updated_at                  :datetime         not null

有些场地的关闭时间是在午夜之后,有些则在午夜之前关闭。

我希望找到与时间now()

相关的所有当前开放的场地

首次尝试

SELECT "venues".* FROM "venues" WHERE (mon_start <= now()::time AND mon_end > now()::time)

如果mon_end在午夜之后,则不会返回记录。

第二次尝试

SELECT "venues".* FROM "venues" WHERE (mon_start <= now()::time AND mon_end + interval '1 day' > now()::time)

但如果mon_end在午夜之后,这仍然不会返回记录。

问题

如何选择mon_start小于现在时间的所有场地,mon_end大于现在的时间。

e.g。 周一开始: 下午4点 周一结束: 凌晨1点 现在: 11: 30PM

奖金问题

我可以根据当天的名称查询正确的列吗?

e.g。如果今天是星期三,请搜索wed_startwed_end

1 个答案:

答案 0 :(得分:1)

您需要使用DATE

<强> SQL DEMO

WITH time_table as (
    SELECT '10:30pm'::time as open_time, '01:30am'::time close_time
    UNION
    SELECT '09:00pm'::time as open_time, '11:30pm'::time close_time
)
SELECT open_time, close_time, now(),
       now()::date + open_time as open_time,
       CASE WHEN close_time > open_time
            THEN now()::date + close_time
            ELSE now()::date + close_time + INTERVAL '1 day'
       END as close_time
FROM time_table

<强>输出

enter image description here