Sql 从表中选择to_char(date_col,'YYYY-MM')-在子查询中不起作用

Sql 从表中选择to_char(date_col,'YYYY-MM')-在子查询中不起作用,sql,postgresql,time-series,Sql,Postgresql,Time Series,我正在尝试使用Postgres9.5.3构建一个查询 函数在下面这样的简单语句中 SELECT to_char(date_created,'YYYY-MM') FROM some_table; 返回如下结果: +----------- | to_char +----------- | 2017-06 | 2017-07 | 2017-10 我要运行的完整语句 导致以下错误 查询中出错:错误:运算符不存在:时区为文本的时间戳 第2行:其中日期不在选择创建的日期中,'YYYY-MM'。。。 提示

我正在尝试使用Postgres9.5.3构建一个查询

函数在下面这样的简单语句中

SELECT to_char(date_created,'YYYY-MM') FROM some_table;
返回如下结果:

+-----------
| to_char
+-----------
| 2017-06
| 2017-07
| 2017-10
我要运行的完整语句

导致以下错误

查询中出错:错误:运算符不存在:时区为文本的时间戳 第2行:其中日期不在选择创建的日期中,'YYYY-MM'。。。 提示:没有与给定名称和参数类型匹配的运算符。您可能需要添加显式类型转换


您的数据类型不匹配。使用TO_DATE可将右侧内部查询转换回日期

或者使用TO_CHAR将左侧转换为CHAR


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

使用间隔作为第三个参数生成_系列实际上返回的是时间戳,而不是日期。您的子选择返回作为字符串文本创建的列date_,并且将时间戳与文本进行比较是无效的

由于您显然只想检查同一个月,因此需要将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);
另一个选项是通过将创建的日期_标准化为月初来比较日期:

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);

感谢您的解释和宝贵的支持。
...
WHERE to_char(dates, 'YYYY-MM')NOT IN (
   SELECT to_char(date_created,'YYYY-MM') FROM some_table
);
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);
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);