4

我有一个带有日期列的表,其中日期以这种格式存储:

2012-08-01 16:39:17.601455+0530

我如何groupgroup_and_count在此栏目上按month

4

2 回答 2

8

您最大的问题是 SQLite 不会直接将您的日期识别为日期。

CREATE TABLE YOURTABLE (DateColumn date);
INSERT INTO "YOURTABLE" VALUES('2012-01-01');
INSERT INTO "YOURTABLE" VALUES('2012-08-01 16:39:17.601455+0530');

如果您尝试使用 strftime() 来获取月份。. .

sqlite> select strftime('%m', DateColumn) from yourtable;
01

. . . 它从第一行开始,但不是从第二行开始。

如果您可以将现有数据重新格式化为有效时间戳(就 SQLite 而言),您可以使用这个相对简单的查询来按年和月分组。(你几乎肯定不想单独按月分组。)

select strftime('%Y-%m', DateColumn) yr_mon, count(*) num_dates 
from yourtable 
group by yr_mon;

如果你不能这样做,你需要做一些字符串解析。这是这个想法的最简单表达。

select substr(DateColumn, 1, 7) yr_mon, count(*) num_dates 
from yourtable 
group by yr_mon;

但这可能不太适合你。由于您有时区信息,因此肯定会更改某些值的月份。要获得一个完全通用的解决方案,我认为您需要更正时区,提取年份和月份,等等。更简单的方法是仔细查看这些数据,声明“我对考虑那些边缘情况不感兴趣”,然后立即使用上面更简单的查询。

于 2012-09-08T15:01:22.483 回答
1

我花了一段时间才找到使用 Sequel 的正确表达方式。我所做的是这样的:

假设一个像这样的表:

CREATE TABLE acct (date_time datetime, reward integer)

然后您可以按如下方式访问聚合数据:

ds = DS[:acct]
ds.select_group(Sequel.function(:strftime, '%Y-%m', :date_time))
   .select_append{sum(:reward)}.each do |row|
  p row
end
于 2015-01-21T17:50:21.447 回答