SQL知识点:日期边界值
一、明确时间范围判断的核心原则
包含边界时用 >=/<=,不包含时用 >/<
例:题目要求「截至 2019-07-27(包含该日期)」→ 结束日期使用 <= '2019-07-27'12
若未明确说明是否包含边界,默认使用等号(如 DATEDIFF(end_date, start_date) <= 90)13
模糊时间单位(年、月)优先用具体日期
例:「过去一年」且已知「今天是 2019-06-23」→ 直接写 dispatch_date >= '2018-06-23',避免计算 365/366 天24
同理,「不满一个月」→ 直接写 available_from <= '2019-05-23'(30 天差异)34
明确时间间隔时用函数计算
例:「最多 90 天内」→ 用 DATEDIFF('2019-06-30', login_date) <= 9035
需注意:DATEDIFF 是否包含当天取决于题目描述15
二、高频题目解法示范
题号 | 核心逻辑 | 关键代码片段 |
---|---|---|
1098 | 排除近1个月书籍,筛选近1年订单量<10 | WHERE available_from <= '2019-05-23' AND dispatch_date >= '2018-06-23' GROUP BY ... HAVING COUNT(*) < 10 |
1107 | 统计90天内每日首次登录用户数 | WHERE DATEDIFF('2019-06-30', activity_date) <= 90 GROUP BY activity_date |
1141 | 统计近30天活跃用户数(含截止日) | WHERE activity_date BETWEEN DATE_SUB('2019-07-27', INTERVAL 29 DAY) AND '2019-07-27' |
三、避免出错的细节补充
时间函数选择
DATE_SUB(end_date, INTERVAL N DAY) 比手动计算日期更可靠(自动处理跨月/年)12
例:近30天 → 实际是29天跨度(包含当天)12
去重与数据唯一性
用户类题目优先加 DISTINCT(如 COUNT(DISTINCT user_id))13
日期格式规范
比较时需加引号(activity_date = '2019-06-23'),避免隐式转换错误23
四、总结公式
近N天活跃用户 = 日期区间属于 [当前日期 - (N-1), 当前日期]
精确时间范围 = 直接指定日期;模糊范围 = 用时间函数动态计算
边界是否包含 → 题目描述优先,无描述默认包含