我有一个Holiday
模型,其holiday_date
属性为DateTime
。
我添加了一个新的假期(元旦),日期为1/1/2019
。
当我在控制台Holiday.last
中进行操作时,会看到以下内容:
#<Holiday id: 50, name: "New Years Day", holiday_date: "2018-12-31 23:00:00", created_at: "2018-11-13 13:15:54", updated_at: "2018-11-13 13:15:54">
因此,它以UTC时间(前一天)保存。然后,当我做Holiday.last.holiday_date
时,我得到了:
Tue, 01 Jan 2019 00:00:00 CET +01:00
太好了,日期会转换为我们的CET日期和时间。但是当我查询这样的一年时:
Holiday.where("extract(year from holiday_date) = '2019'")
它不返回任何结果。因此,此查询似乎没有转换为CET时间。如何确保查询返回我添加的假期?
答案 0 :(得分:2)
您必须两次投放时区:
Holiday.where(
"extract(year from holiday_date AT TIME ZONE 'UTC' AT TIME ZONE 'CET') = '2019'"
)
这可以工作,但是为您的查询使用索引会很好,我们只需要更好地准备它即可:
year = Time.zone.parse("2019-01-01")
Holiday.where("holiday_date BETWEEN ? AND ?", year.beginning_of_year, year.end_of_year)
# SELECT "holidays".* FROM "holidays" WHERE (holiday_date BETWEEN '2018-12-31 23:00:00' AND '2019-12-31 22:59:59.999999')
我真的认为您是否需要holiday_date
列的日期时间,也许日期就足够了,这样就不必处理时区了。
答案 1 :(得分:1)
您可以按时区进行查询
unsigned char