年份查询未返回任何结果

时间:2018-11-13 13:37:48

标签: ruby-on-rails

我有一个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时间。如何确保查询返回我添加的假期?

2 个答案:

答案 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