【发布时间】:2015-10-21 08:29:11
【问题描述】:
我在 PostgreSQL 中工作,我有表名 my_table 架构
CREATE TABLE my_table
(
my_table_id character varying(50) NOT NULL,
bar_id character varying(50),
beer_id character varying(50),
status_id character varying(50),
updated_at bigint,
CONSTRAINT my_table_id PRIMARY KEY (craft_bar_beer_id ),
CONSTRAINT my_table_bar_id_fk FOREIGN KEY (bar_id)
REFERENCES table_bar (bar_id) MATCH Unknown
ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT beer_status_id_fk FOREIGN KEY (status_id)
REFERENCES status (status_id) MATCH Unknown
ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT beer_id_fk FOREIGN KEY (beer_id)
REFERENCES beer (beer_id) MATCH Unknown
ON UPDATE NO ACTION ON DELETE NO ACTION
);
现在输出是 beer_id 的计数,其状态为“1”和“2”并按日期分组(此处假设提供 2016 年或应显示过去 10 年的记录)
count(beer_id) status year
4 1 2014
5 1 2015
3 2 2014
6 2 2016
但这里updated_at 字段是bigint,它是从Java Date 对象派生的以毫秒为单位的时间:
Date dateValue = null;
SimpleDateFormat formatter = new SimpleDateFormat(dateFormat);
formatter.setTimeZone(TimeZone.getTimeZone("GMT"));
dateValue = formatter.parse(dateStr);
return dateValue.getTime();
我试过的查询:
SELECT count(cbeer.beer_id) AS beers, cbeer.status_id AS Status
FROM my_table cbeer
INNER JOIN bar cb ON cb.bar_id = cbeer.bar_id
WHERE status_id IN ('1','2')
GROUP BY cbeer.status_id;
输出:
beers Status
5 1
1 2
当日期很长并且我希望它按过去 10 年分组时,如何查询以获取日期明智的记录。如果为 ex: 2015 提供年份,则按 2015 分组并获取该年的月份相关记录。
【问题讨论】:
-
一开始就将时间戳存储为 long 并不是一个好主意(您现在明白为什么了)。但是您可以使用
to_timestamp()将 unix 纪元值转换为时间戳。详见手册postgresql.org/docs/current/static/functions-formatting.html -
您说时间以毫秒为单位并存储在
long中。你能给我们看一个样本吗?你确定它是毫秒而不是秒吗? -
@Patrick 是的,我已将字符串中的日期转换为以毫秒为单位的时间,并将其存储在数据类型 bigint 中。你想让我给你看什么样品?
-
您能否举例说明如何将此字符串转换为
bigint?原因是存储在bigint中的“日期”(大概是时间)需要一些参考点。值 0 表示什么日期 + 时间? PostgreSQL 中的旧标准是以 bigint 格式存储timestamp,Unix 默认为 0 点以秒为单位。因此我的问题。 -
日期 dateValue = null;SimpleDateFormat formatter = new SimpleDateFormat(dateFormat); formatter.setTimeZone(TimeZone.getTimeZone("GMT")); dateValue = formatter.parse(dateStr);返回 dateValue.getTime();
标签: sql postgresql timestamp epoch