0
SELECT CONCAT(EXTRACT(MONTH
                        FROM '{{ date.start }}'::timestamp ),'/',
                       EXTRACT(YEAR
                        FROM '{{ date.start }}'::timestamp )) - interval '1' MONTH

运行此查询时出现错误

运行查询时出错:运算符不存在:文本 - 间隔第 25 行:... FROM '2019-01-01'::timestamp )) - 间隔... ^ 提示:没有运算符与给定的名称和参数类型匹配。您可能需要添加显式类型转换。

如何解决?

4

2 回答 2

2

您需要删除它,concat()因为它会将 timstamp 转换为 varchar。

如果您想获得“时间戳”值的月初,有更简单的方法可以做到这一点:

date_trunc('month', '{{ date.start }}'::timestamp)

结果是一个时间戳,您可以从中减去间隔:

date_trunc('month', '{{ date.start }}'::timestamp) - interval '1 month'

以下示例查询:

with sample_data (input_date) as (
  values 
    (timestamp '2019-01-01 17:18:19'), 
    (timestamp '2019-02-07 16:30:40'), 
    (timestamp '2019-03-02 23:30:42')
)    
select input_date, 
       (date_trunc('month', input_date) - interval '1 month')::date as previous_month_start
from sample_data;

返回以下结果:

input_date          | previous_month_start
--------------------+---------------------
2019-01-01 17:18:19 | 2018-12-01          
2019-02-07 16:30:40 | 2019-01-01          
2019-03-02 23:30:42 | 2019-02-01          

如果您想以不同的格式显示结果,请应用to_char()结果:

to_char(date_trunc('month', input_date) - interval '1 month', 'mm/yyyy')

在线示例

于 2019-11-20T09:33:31.220 回答
0

从 OP 中的评论和查询中,我认为您正在尝试将时间戳转换为MM/YYYY减去 1 个月间隔的自定义格式。

以下只是实现此目的的少数方法之一: 使用连接运算符 ||

SELECT (extract(month FROM (input_date - interval '1 month')))::text 
                  || '/' 
                  || (extract(year FROM (input_date - interval '1 month')))::text 
    AS formatted_string;
于 2019-11-20T10:43:21.307 回答