使用dateadd和getdate时能否跳过前一天?T-SQL查询需求
解决SQL Server中延迟一天获取过去7天数据的问题
首先明确你的需求:今日是4月5日时,要获取4月3日及往前7天的数据(也就是3月27日到4月3日的范围),核心是因为同步延迟,要跳过今日和昨天的数据,取到前天为止的7天记录。
你的原语句问题在于基准日期没调整对,而且误用了MySQL的interval语法(SQL Server不支持)。正确的写法可以这样调整:
SELECT INCUNITS.INCNUM AS [Event ID] FROM INCUNITS WHERE -- 基准日设为当前日期减2天(今日4月5日的话就是4月3日),再往前推7天作为起始点 DISPDATE >= DATEADD(dd, -9, GETDATE()) -- 同时限制数据截止到基准日(4月3日),避免包含未同步的后续数据 AND DISPDATE <= DATEADD(dd, -2, GETDATE()) AND INCUNITS.OSTIME > '0'
如果你的DISPDATE是纯日期类型(不带时分秒),也可以用更简洁的BETWEEN写法:
SELECT INCUNITS.INCNUM AS [Event ID] FROM INCUNITS WHERE DISPDATE BETWEEN DATEADD(dd, -9, GETDATE()) AND DATEADD(dd, -2, GETDATE()) AND INCUNITS.OSTIME > '0'
日期计算说明
DATEADD(dd, -2, GETDATE()):把当前日期往前推2天,得到你要的截止日期(比如4月5日→4月3日)DATEADD(dd, -9, GETDATE()):是截止日期再往前推7天(-2-7=-9),得到数据的起始日期(4月3日→3月27日)
额外优化建议
如果GETDATE()返回带时分秒的时间,可能会导致边界值遗漏(比如4月3日的晚些数据被过滤),建议先转成纯日期再计算,更精确:
DECLARE @CutoffDate DATE = CAST(DATEADD(dd, -2, GETDATE()) AS DATE) SELECT INCUNITS.INCNUM AS [Event ID] FROM INCUNITS WHERE DISPDATE >= DATEADD(dd, -7, @CutoffDate) AND DISPDATE <= @CutoffDate AND INCUNITS.OSTIME > '0'
内容的提问来源于stack exchange,提问作者Lee.91
相关产品推荐
相关产品推荐

