我正在运行一个查询,该查询使用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.ago
或0.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/