我正在运行一个查询,该查询使用GroupBy gem将数据库中过去三天(包括今天在内)的记录活动存在的天数(按天分组)。这是完整的查询:

Record.activities.where("created_at >= ?", 2.days.ago.beginning_of_day.in_time_zone).group_by_day(:created_at).count.count


2天前,我有1个活动,昨天我有0,今天我有2。这应该返回2(而不是3,这不是活动的天数),但由于某种原因它返回3。更奇怪的是,如果我将2.days.ago更改为1.day.ago0.days.ago,它会返回正确的值1。它忽略昨天没有活动的地方,而只计算它识别出有活动的一天(今天)。

如果删除第二个.count,则返回2.days.ago的内容...

{Tue, 21 Nov 2017=>1, Wed, 22 Nov 2017=>0, Thu, 23 Nov 2017=>2}


如果我为1.day.ago运行它,我得到...

{Thu, 23 Nov 2017=>2}


这是2.days.ago查询的原始SQL。

SELECT COUNT(*) AS count_all, strftime('%Y-%m-%d 00:00:00 UTC', created_at)
AS strftime_y_m_d_00_00_00_utc_created_at
FROM "activities"
WHERE "activities"."goal_id" = ? AND (created_at >= '2017-11-21 00:00:00')
AND (created_at IS NOT NULL)
GROUP BY strftime('%Y-%m-%d 00:00:00 UTC', created_at)


经过更多测试之后,我注意到如果x.days.ago中的x落在0的那一天,它只会忽略活动0的一天。如果活动1的天超过1天,它将忽略第一个活动,但是应该然后用0算出接下来的其他日子...

不确定我在这里缺少什么,但是希望能帮助您发现问题。

让我知道您是否需要更多信息。

最佳答案

您可以使用.having('count(activities.id) > 0')忽略无活动的日子

以下未经测试的查询:

Record.activities
  .select('count(activities.id) as count_all,date(activities.created_at) as day')
  .where("created_at >= ?", 2.days.ago.beginning_of_day.in_time_zone)
  .group('day').having('count_all > 0')

关于mysql - count方法根据条件中的日期返回不同的值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47453171/

10-12 04:33