从日期减去1个月的间隔?

时间:2019-11-20 09:28:27

标签: postgresql-11

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

运行此查询时出现错误

  

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

如何解决?

2 个答案:

答案 0 :(得分:1)

您需要删除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')

Online example

答案 1 :(得分:0)

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

以下仅仅是实现这一目标的几种方法之一:使用concatenation operator ||

SELECT (extract(month FROM (input_date - interval '1 month')))::text 
                  || '/' 
                  || (extract(year FROM (input_date - interval '1 month')))::text 
    AS formatted_string;