我正在尝试从unixtimestamp列中以yyyy-mm-dd格式获取结果,但要获取yyyy-mm-dd hh:mm:ss
receive_time列中的数据如下:
recieve_time
1557866863 |
1557866863 |
1557866863 |
1557866863 |
1557866864 |
1557866864 |
1557866864 |
1557866864 |
以下是我的查询:
SELECT
to_timestamp(recieve_time) as date, count(*)
FROM public.cdrs WHERE
usage_type='0800 Voice Incoming'
and to_timestamp(recieve_time) >='2019-05-01 00:00:00'
AND to_timestamp(recieve_time) <'2019-06-01 00:00:00'
AND main_bzd >0
group by to_timestamp(recieve_time)
得到这个:
date |count|
-------------------|-----|
2019-05-01 00:00:2 |1 |
2019-05-01 00:03:2 |1 |
2019-05-01 01:20:0 |1 |
2019-05-01 01:21:1 |1 |
2019-05-01 01:53:0 |1 |
2019-05-01 02:16:5 |1 |
2019-05-01 02:33:5 |1 |
2019-05-01 02:39:4 |1 |
2019-05-01 02:55:3 |1 |
2019-05-01 03:32:5 |1 |
2019-05-01 03:35:0 |1 |
我的要求如下:
date |count|
------------|-----|
2019-05-01 |19 |
2019-05-02 |15 |
2019-05-03 |17 |
答案 0 :(得分:2)
在date
列表和SELECT
子句中都将结果保存到GROUP BY
:
CAST(to_timestamp(recieve_time) AS date)
答案 1 :(得分:1)
我认为在PostgreSQL中将unix时间戳转换为日期格式的最简单方法如下:
select to_timestamp(1557866863)::date;
to_timestamp
--------------
2019-05-15
(1 row)
因此您的完整SQL将是:
select
to_timestamp(recieve_time)::date as date,
count(*)
from
public.cdrs
where
usage_type='0800 Voice Incoming'
and receive_time >= extract(epoch from cast('2019-05-01 00:00:00' as timestamptz))
and receive_time < extract(epoch from cast('2019-06-01 00:00:00' as timestamptz))
and main_bzd >0
group by
to_timestamp(recieve_time)::date
注意:如果在index
列上创建了receive_time
,则最好不要在receive_time
子句中使用where
上的函数过滤行,这将导致执行SQL时无法使用索引,我的SQL中的上述方法是更好的方法。祝你好运!
答案 2 :(得分:0)
对于格式化日期,应使用函数“ to_char” https://www.postgresql.org/docs/9.6/functions-formatting.html 它支持时间格式,或者您可以使用摘录来分隔日期部分。
SELECT to_char(to_timestamp( 156049813956389/100000), 'yyyy-mm-dd')