【问题标题】:SELECT to_char(date_col, 'YYYY-MM') from table - doesn't work in subquerySELECT to_char(date_col, 'YYYY-MM') from table - 在子查询中不起作用
【发布时间】:2018-06-17 11:22:08
【问题描述】:

我正在尝试使用 Postgres 9.5.3

构建查询

函数to_char在这样的简单语句中

SELECT to_char(date_created,'YYYY-MM') FROM some_table;

返回结果如下:

+-----------
| to_char
+-----------
| 2017-06
| 2017-07
| 2017-10

我要运行的完整语句

SELECT * FROM generate_series(
                    to_date('2016-01-01', 'YYYY-MM'), 
                    to_date('2017-01-01', 'YYYY-MM'), 
                    interval '1 month') 
AS dates
    WHERE dates NOT IN (
       SELECT to_char(date_created,'YYYY-MM') FROM some_table
    );

导致以下错误

查询错误:错误:运算符不存在:时区时间戳 = 文本 第 2 行:日期不在 (SELECT to_char(date_create,'YYYY-MM')... 提示:没有运算符与给定名称和参数类型匹配。您可能需要添加显式类型转换。

【问题讨论】:

    标签: sql postgresql time-series


    【解决方案1】:

    您的数据类型不匹配。使用TO_DATE 将右侧(内部查询)转换回DATE

    ...
    WHERE dates NOT IN (
       SELECT to_date(to_char(date_created,'YYYY-MM'), 'YYYY-MM-DD') FROM some_table
    );
    

    或使用TO_CHAR 将左侧转换为CHAR

    ...
    WHERE to_char(dates, 'YYYY-MM')NOT IN (
       SELECT to_char(date_created,'YYYY-MM') FROM some_table
    );
    

    【讨论】:

      【解决方案2】:

      您正在将苹果与橙子进行比较(时间戳与文本)。

      generate_series() 以间隔作为第三个参数实际上返回 timestamp,而不是 date。您的子选择将列 date_created 作为字符串(文本)返回 - 并且将时间戳与文本进行比较不起作用。

      由于您显然只想检查同一个月,因此您需要将从generate_series() 返回的日期转换为相同的文本值:

      SELECT *
      FROM generate_series(to_date('2016-01-01', 'YYYY-MM'), 
                           to_date('2017-01-01', 'YYYY-MM'), 
                           interval '1 month') as dates (d)
      WHERE to_char(dates.d, 'yyyy-mm') NOT IN (SELECT to_char(date_created,'YYYY-MM') 
                                                FROM some_table);
      

      另一种选择是通过将date_created“标准化”到月初来比较日期:

      SELECT *
      FROM generate_series(to_date('2016-01-01', 'YYYY-MM'), 
                           to_date('2017-01-01', 'YYYY-MM'), 
                           interval '1 month') as dates (d)
      WHERE dates.d NOT IN (SELECT date_trunc('month', date_created)
                            FROM some_table);
      

      【讨论】:

      • 感谢您的解释和宝贵的支持。
      猜你喜欢
      • 2022-12-07
      • 2018-05-10
      • 2013-02-08
      • 1970-01-01
      • 2019-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多