如何查询PostgreSQL中item_sold表的无销售记录日期?
获取无销售记录的日期(PostgreSQL)
方法1:生成日期序列 + 左连接筛选
先用generate_series生成目标时间范围内的所有日期,再与item_sold表按日期左连接,筛选出未匹配到销售记录的日期:
WITH date_range AS ( SELECT generate_series( '2020-01-01'::DATE, '2023-01-01'::DATE, '1 day'::INTERVAL ) AS all_dates ) SELECT all_dates AS no_sale_date FROM date_range LEFT JOIN item_sold ON date_range.all_dates = item_sold.date WHERE item_sold.date IS NULL ORDER BY no_sale_date;
方法2:使用NOT EXISTS子查询
直接生成日期序列,通过子查询判断该日期是否不存在于销售记录中:
SELECT generate_series( '2020-01-01'::DATE, '2023-01-01'::DATE, '1 day'::INTERVAL ) AS no_sale_date WHERE NOT EXISTS ( SELECT 1 FROM item_sold WHERE item_sold.date = generate_series ) ORDER BY no_sale_date;
关键注意点
- 若
item_sold.date是TIMESTAMP类型,需转换为DATE类型(即item_sold.date::DATE),避免时间部分导致匹配失败。 - 之前WITH子句失败大概率是日期序列生成错误,或未处理日期/时间戳类型不匹配的问题。
内容的提问来源于stack exchange,提问作者Vishal
相关产品推荐
相关产品推荐

