![](/img/trans.png)
[英]How to get date/time with millisecond from oracle database using java?
[英]How to Group By using Month from date stored as millisecond Postgres
我有一个事务表,其中包含net_amount
字段和last_updated_time
字段,其中last_updated_time
以毫秒存储。 我需要通过使用月份,年份或日期来获取总金额组。 如何在PostgreSQL中做到这一点?
我的表如下所示:
+------------+-------------------+
| net_amount | last_updated_time |
+------------+-------------------+
| 100 | 1470286872831 |
+------------+-------------------+
| 200 | 1471594713801 |
+------------+-------------------+
| 300 | 1471594651335 |
+------------+-------------------+
预期结果为:
+----------+---------------+
| month | sum_of_amount |
+----------+---------------+
| january | 1000 |
+----------+---------------+
| february | 2000 |
+----------+---------------+
| --- | ---- |
+----------+---------------+
您可以执行以下操作:
SELECT sum(amount), date_trunc('month', to_timestamp(last_updated_time/1000))
FROM transaction
GROUP BY date_trunc('month', to_timestamp(last_updated_time/1000));
我只是在我的辅助项目数据库上检查了它,它对我有用。
编辑:我将last_update_time转换为@a_horse_with_no_name指出的时间戳。
如果我正确理解了您的问题,则可以尝试执行以下操作(Java 8)
long day1MSec, day2MSec ;
LocalDate localDate1 = LocalDate.of( 2011 , Month.JULY , 3 );
LocalDate localDate2 = LocalDate.of( 2011 , Month.JULY , 25 );
final long msPerDay = 24 * 60 * 60 * 1000;//milisec per day
day1MSec = localDate1.toEpochDay() * msPerDay;
day2MSec = localDate2.toEpochDay() * msPerDay;
//now your sql would look something like
String sql = "select sum(amount)from transaction group by last_updated having last_updated between "+day1MSec + " and "+day2MSec;
因此,您需要在Java代码中做的就是将日期转换为毫秒。 如果要使用几个月或几年,只需调整日期以匹配一个月或一年的开始。
LocalDate localDate1 = LocalDate.of( 2011 , Month.JANUARY , 1 );
更新:对于低于8的Java版本,可以使用
Date date = new SimpleDateFormat("yyyy-MM-dd", Locale.ITALY).parse("2015-06-25");
long mSec = date.getTime(); //this returns miliseconds
奇怪的是,这两个版本产生的结果不同,所以我想知道第一个版本是否存在错误(因为第二个版本似乎给出了正确的结果)
您可以编写一个查询,使聚合准备就绪:
create table Transaction
(
amount DECIMAL(9,2),
last_updated_time BIGINT
);
insert into Transaction values (10, 1472680800000); -- 2016-09-01
insert into Transaction values (20, 1473458400000); -- 2016-09-10
insert into Transaction values (30, 1474408800000); -- 2016-09-21
insert into Transaction values (5, 1475272800000); -- 2016-10-01
insert into Transaction values (2, 1475272800000); -- 2016-10-01
insert into Transaction values (7, 1475272800000); -- 2016-10-02
insert into Transaction values (15, 1478818800000); -- 2016-11-11
将EXTRACT与to_timestamp结合to_timestamp
以提取所需的内容( MONTH
, YEAR
),然后对其进行group by
。
select
sum(amount),
EXTRACT(MONTH FROM to_timestamp(last_updated_time/1000)) as month
from Transaction
group by month order by month asc;
sum | month
-------+-------
60.00 | 9
14.00 | 10
15.00 | 11
select
sum(amount),
EXTRACT(YEAR FROM to_timestamp(last_updated_time/1000)) as year
from Transaction
group by year order by year asc;
sum | year
-------+--------
89.00 | 2016
最后,要表达我的意见,您可以EXTRACT
select
的年份和月份,然后将它们都group by
( 请参见此处 )。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.