如何编写SQL视图筛选今日至7天后的日期数据?
解决SQL日期筛选:今日至7天后的数据
嘿,我来帮你搞定这个日期筛选的问题!
你想要的是筛选**今日(包含当天)到7天后(包含当天)**的数据,但之前的写法犯了两个关键错误:
- 方向搞反了:你用了
DATEADD(DAY, -7, GETDATE()),这是取「7天前的时间」,所以>这个条件会把所有晚于7天前的记录都拉出来,包括未来很久的数据,自然不符合需求。 - 未处理时间部分:如果直接用带时分秒的
GETDATE()做比较,会导致区间范围不准确,漏掉部分带时间的记录。
正确的SQL写法分两种情况:
1. 当GettingBackDate是DATE类型(无时间部分)
直接用BETWEEN即可,因为DATE类型只包含日期:
WHERE sl.GettingBackDate BETWEEN CAST(GETDATE() AS DATE) AND DATEADD(DAY, 7, CAST(GETDATE() AS DATE))
2. 当GettingBackDate是DATETIME/DATETIME2类型(带时间部分)
推荐用范围比较,避免漏掉7天后当天晚于0点的记录:
WHERE sl.GettingBackDate >= CAST(GETDATE() AS DATE) AND sl.GettingBackDate < DATEADD(DAY, 8, CAST(GETDATE() AS DATE))
解释:
CAST(GETDATE() AS DATE)会去掉当前时间的时分秒,只保留纯日期(比如今天是2018-04-09,就转为2018-04-09)。DATEADD(DAY, 8, CAST(GETDATE() AS DATE))得到的是「今日加8天」的日期,用<这个值就包含了从今日00:00:00到7天后23:59:59的所有时间数据,不会遗漏任何带时间的记录。
验证你的示例数据
假设今日是2018-04-09,筛选区间就是2018-04-09至2018-04-16(7天后):
- 符合条件的:
2018-04-12、2018-04-16(正好在区间内) - 被过滤的:其他日期要么早于2018-04-09,要么远晚于2018-04-16,会被正确排除。
内容的提问来源于stack exchange,提问作者Kar
相关产品推荐
相关产品推荐

