Sql 从表中选择to_char(date_col,'YYYY-MM')-在子查询中不起作用
我正在尝试使用Postgres9.5.3构建一个查询 函数在下面这样的简单语句中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'。。。 提示
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);