1

我很难理解为什么在 Rails 中的 SQLite 中的 datetime 列上按 DATE 分组返回 nil。我想返回在 startdate 字段中有值的用户计数,按日期分组。

任何人都可以帮忙吗?删除以下查询的 DATE 方面会返回我期望的结果。请参阅下面的不同查询和结果:

User.where("startdate IS NOT NULL").group("DATE(startdate)").count

SELECT COUNT(*) AS count_all, DATE(startdate) AS date_startdate 
FROM "users" 
WHERE (startdate IS NOT NULL) 
GROUP BY DATE(startdate)

=>{nil=>10}

我期望的是日期数组(例如 {“2013-06-04”=>3、“2013-06-10”=>4、“2013-06-11”=>3}。在下面的查询中它没有 DATE 运算符,结果更符合我的预期,但显然我也不想按时间分组(在我的实际数据库中,同一日期有不同的时间)。

User.where("startdate IS NOT NULL").group("(startdate)").count

SELECT COUNT(*) AS count_all, (startdate) AS startdate 
FROM "users" 
WHERE (startdate IS NOT NULL) 
GROUP BY (startdate)  

=>{"2013-06-04 17:27:30.553802+0000"=>3, "2013-06-10 09:24:06.207327+0000"=>4, "2013-06-11 12:20:37.745819+0000"=>3}

4

4 回答 4

2

date()函数需要时区匹配格式“[-+]HH:MM”或“Z”:

2013-10-07 08:23:19.120
2013-10-07T08:23:19.120Z
2013-10-07 08:23:19.120-04:00
于 2013-10-27T10:43:39.237 回答
2

SQLite 对您的数据期望的最接近日期格式的字符串YYYY-MM-DD HH:MM:SS.SSS是.

如果您所有的日期都在同一个时区,+0000您可以完全忽略DATE函数并比较子字符串:

User.where("startdate IS NOT NULL").group("SUBSTR(startdate,1,10)").count

无论如何,SQLite 不执行日期比较。事实上,DATE函数总是返回TEXT

如果您处理不同的时区(最好尝试在您的应用程序中处理它们),可以使用Date/time functions modifiers完成额外的计算。

编辑:

正如@chuck.p.lee 正确纠正我的那样,最接近的格式是现在YYYY-MM-DD HH:MM:SS.SSS+HH:MM。因此,使用一些字符串操作(截断亚毫秒部分)将您的日期转换为此非常容易:

SUBSTR(startdate, 1, 23) || SUBSTR(startdate, 27, 3) || ':' || SUBSTR(startdate, 30,2)

现在您的查询可能正确地写为:

User.where("startdate IS NOT NULL").group("DATE(SUBSTR(startdate, 1, 23) || SUBSTR(startdate, 27, 3) || ':' || SUBSTR(startdate, 30,2))").count
于 2013-10-28T09:48:32.330 回答
1

将日期转换为 mm/dd/yyyy 格式的字符串,然后按该字符串分组

这是 ms sql server 代码的样子:

SELECT COUNT(*) AS count_all, convert(varchar(10),startdate, 101) AS date_startdate FROM      "users" WHERE (startdate IS NOT NULL) GROUP BY date_startdate
于 2013-10-27T08:19:24.813 回答
-1

您的 sql 查询是正确的,并且 RoR 命令也是正确的。

它在 Postgresql 上运行良好。我认为问题在于在 sqlite 上使用 DATE 函数。可能是区分大小写的,您应该尝试“日期”功能而不是“日期”,但我不确定这一点。

于 2013-10-27T08:48:52.890 回答