技术求助:获取CRM中2022年第36周全周活动列表(DATEADD函数异常)
查询2022年第36周全部活动的正确方案
你之前用DATEADD(week, 36, '2022')只能返回第36周的起始日数据,因为这个函数仅生成单一天的日期,而非整周范围。要获取该周所有活动,需要明确周的起始和结束时间,再通过范围条件过滤数据。以下是主流数据库的实现方案:
SQL Server
默认周日为周起始(可通过SET DATEFIRST修改),用日期范围查询:
SELECT * FROM Customers WHERE 活动日期 >= DATEADD(week, 36, '2022-01-01') AND 活动日期 < DATEADD(week, 37, '2022-01-01');
若需以周一为周起始,先设置参数再查询:
SET DATEFIRST 1; -- 设定周一为每周第一天 SELECT * FROM Customers WHERE 活动日期 >= DATEADD(week, 36, '2022-01-01') AND 活动日期 < DATEADD(week, 37, '2022-01-01');
MySQL
可直接通过周数匹配,或用日期范围:
- 按周数查询(第二个参数
1表示周一为周起始,0为周日):
SELECT * FROM Customers WHERE YEAR(活动日期) = 2022 AND WEEK(活动日期, 1) = 36;
- 日期范围方式:
SELECT * FROM Customers WHERE 活动日期 >= STR_TO_DATE('2022 36 Monday', '%X %V %W') AND 活动日期 < STR_TO_DATE('2022 37 Monday', '%X %V %W');
PostgreSQL
PostgreSQL默认周一为周起始,两种查询方式:
- 按周数提取:
SELECT * FROM Customers WHERE EXTRACT(YEAR FROM 活动日期) = 2022 AND EXTRACT(WEEK FROM 活动日期) = 36;
- 日期范围方式:
SELECT * FROM Customers WHERE 活动日期 >= DATE_TRUNC('week', '2022-01-01'::DATE + INTERVAL '35 weeks') AND 活动日期 < DATE_TRUNC('week', '2022-01-01'::DATE + INTERVAL '36 weeks');
注意事项
- 不同数据库对“周”的定义存在差异(如起始日、第一周判定规则),需根据实际数据库配置调整。
- 优先使用日期范围查询(
>=+<),这种方式能利用日期字段的索引,查询效率更高。
内容的提问来源于stack exchange,提问作者qwatro_
相关产品推荐
相关产品推荐

