sql - 根据日期范围排除某些产品
问题描述
例如,我有 1 年的销售数据,并且某些产品在特定日期范围内不可用。
我目前有 1 个日期范围,但如果有多个排除项,最佳做法是什么?
SELECT * FROM XXX
WHERE
IF(Date BETWEEN '2018-11-22' AND '2019-03-28',
ID IN (8467,8468,8469,8470),
ID IN (8467,8468,8469,8470,9551,9552,9553)
)
特别是如果日期重叠,如何解决这个问题?
解决方案
如果您试图排除值,我在想:
SELECT *
FROM XXX
WHERE ID IN (8467, 8468, 8469, 8470, 9551, 9552, 9553) AND
(Date BETWEEN '2018-11-22' AND '2019-03-28' AND
ID NOT IN (9551, 9552, 9553) OR
Date NOT BETWEEN '2018-11-22' AND '2019-03-28'
);
您可以为其他日期添加多对。
对于完整的解决方案,您可能需要创建一个带有 olumns 的表,例如:
product_id
start_exclusion_date
end_exclusion_date
然后将查询表述为:
select xxx.*
from xxx left join
exclusions e
on xxx.id = e.product_id and
xxx.date >= e.start_exclusion_date and
xxx.date <= e.end_exclusion_date
where xxx.id in ( . . . );
从长远来看,这可能更容易维护。
推荐阅读
- kubernetes - 无法在 kubernetes 上安排 prometheus-server pod,pod 报告污点,但节点没有任何污点
- c++ - Ofstream->write 不写入最终数据包
- angular - Angular Essentials 在 VS Code 中不起作用
- mysql - 索引列大小太大。最大列大小为 767 字节。在 Laravel 中导入现有数据库(仔细阅读,不要重复)
- python - 我已经使用 ubuntu 14.04 为 python PyQt4 应用程序创建了一个 docker 映像,现在当我运行容器时,我想访问 docker 主机 ip 和接口
- scala - 创建具有泛型类型的单例对象的标准/正确方法
- javascript - 如何让 Vue 在 init 上自动实例化组件?
- python - 在 Django Rest Famework 中格式化 TimeField 输入和输出的正确方法?
- javascript - Angular 5 HTTP 请求保护
- powershell - 使用 PowerShell 从 Windows 1607 更新到 1809