如何在PostgreSQL中将unix时间戳列转换为日期格式?

时间:2019-06-14 07:28:22

标签: postgresql

我正在尝试从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   |

3 个答案:

答案 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')