【问题标题】:subtract 1 month interval from date?从日期中减去 1 个月的间隔?
【发布时间】:2019-11-20 09:28:27
【问题描述】:
SELECT CONCAT(EXTRACT(MONTH
                        FROM '{{ date.start }}'::timestamp ),'/',
                       EXTRACT(YEAR
                        FROM '{{ date.start }}'::timestamp )) - interval '1' MONTH

运行此查询时出现错误

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

如何解决?

【问题讨论】:

    标签: postgresql-11


    【解决方案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

    【讨论】:

    • 如果我的日期是 2019 年 1 月 1 日,那么当我减去 1 个月得到 12/2018 时我需要处理这种情况
    • 这也适用于 2019-01-01。 rextester.com/PDFL53085
    • 使用MM/YY作为to_char()的格式字符串
    【解决方案2】:

    根据 cmets 和 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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-04
      • 2016-12-08
      • 1970-01-01
      • 2011-02-14
      • 1970-01-01
      • 2017-08-23
      • 2018-03-12
      相关资源
      最近更新 更多