按Postgresql日期时间分组

时间:2013-06-19 06:06:58

标签: database postgresql group-by

HY。我的postgresql数据库中有员工记录,如

 CODE     DATE       COUNT 
"3443"   "2009-04-02"  3
"3444"   "2009-04-06"  1
"3443"   "2009-04-06"  1
"3443"   "2009-04-07"  7

我想使用一个查询“选择所有代码并计算他们在本月发生的事情”

结果:

 CODE     DATE     COUNT 
"3443"   "2009-04"  3
"3441"   "2009-04"  13
"3442"   "2009-04"  11
"3445"   "2009-04"  72

我确实使用过查询,即

SELECT CODE,date_part('month',DATE),count(CODE)
FROM employee
where 
group by CODE,DATE

上述查询运行正常,但记录中列出的月份是数字形式,很难找到一个月属于哪一年。简而言之,我想得到结果,如上面在RESULT部分中提到的那样。感谢

3 个答案:

答案 0 :(得分:18)

试试这个:

SELECT CODE, to_char(DATE, 'YYYY-MM'), count(CODE)
FROM employee
where 
group by CODE, to_char(DATE, 'YYYY-MM')

答案 1 :(得分:12)

根据您是希望将结果显示为文本还是日期,您也可以这样写:

SELECT CODE, date_trunc('month', DATE), COUNT(*)
    FROM employee
    GROUP BY CODE, date_trunc('month', DATE);

在你的例子中会返回这个,DATE仍然是一个时间戳,如果你要对它进行进一步的计算,这可能很有用,因为不需要转换:

 CODE     DATE     COUNT 
"3443"   "2009-04-01"  3
"3441"   "2009-04-01"  13
"3442"   "2009-04-01"  11
"3445"   "2009-04-01"  72

date_trunc()也接受其他值,例如quarteryear等。 有关所有值,请参阅documentation

答案 2 :(得分:1)

尝试

中的任何一个
SELECT CODE,count(CODE),
    DATE as date_normal, 
    date_part('year', DATE) as year, 
    date_part('month', DATE) as month, 
    to_timestamp(
        date_part('year', DATE)::text 
        || date_part('month', DATE)::text, 'YYYYMM')
        as date_month
FROM employee
where 
group by CODE,DATE;