我很难理解为什么DATE在Rails中的SQLite中的日期时间列上的分组返回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年6月11日” =→3}。在下面没有DATE运算符的查询中,结果更像我期望的那样,但显然我也不想按时间分组(在我的实际DB中,在相同的日期有不同的时间)。 / p>
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}
答案 0 :(得分: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
答案 1 :(得分:2)
最近date formated string 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 correctly corrected me,最接近的格式现为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
答案 2 :(得分:1)
将日期转换为格式为mm / dd / yyyy的字符串,然后按该字符串分组
这是ms sql服务器代码的样子:
SELECT COUNT(*) AS count_all, convert(varchar(10),startdate, 101) AS date_startdate FROM "users" WHERE (startdate IS NOT NULL) GROUP BY date_startdate
答案 3 :(得分:-1)
你的sql查询是正确的,还有RoR命令。
它在Postgresql上运行正常。我认为问题是在sqlite上使用DATE函数。可能是区分大小写的,您应该尝试“日期”功能而不是“DATE”,但我不确定这一点。