SQL获取过去30天数据正常,获取前30天数据失败?求指导
问题分析与解决
嘿,这问题其实很容易忽略!你写的第二个查询语句里,日期范围的上下限搞反了,导致没有任何数据能满足这个条件。
为什么最近30天的语句有效?
看你第一个查询:
SELECT * FROM [myDB].[dbo].[myTable] WHERE [CreatedDate] >= DATEADD(day,-30,GETDATE()) AND [CreatedDate] <= GETDATE()
DATEADD(day,-30,GETDATE()) 会得到当前日期往前推30天的时间点,这个时间点肯定比GETDATE()(当前时间)要早,所以你的条件是找“创建日期在30天前到现在之间”的数据,逻辑完全通顺,自然能查到结果。
第二个语句的错误在哪?
再看你写的第二个查询:
SELECT * FROM [myDB].[dbo].[myTable] WHERE [CreatedDate] >= DATEADD(day,-30,GETDATE()) AND [CreatedDate] <= DATEADD(day,-60,GETDATE())
这里DATEADD(day,-30,GETDATE())是30天前,DATEADD(day,-60,GETDATE())是60天前——60天前显然比30天更早(比如今天是2024-05-10,30天前是2024-04-10,60天前是2024-03-11)。你的条件变成了“创建日期既要晚于30天前,又要早于60天前”,这根本不可能有数据满足,所以查询自然没有结果。
正确的写法
只需要把两个日期条件的上下限调换位置,或者调整比较运算符的方向就行:
-- 方法1:调换DATEADD的位置,保持>=和<=的逻辑 SELECT * FROM [myDB].[dbo].[myTable] WHERE [CreatedDate] >= DATEADD(day,-60,GETDATE()) AND [CreatedDate] <= DATEADD(day,-30,GETDATE()) -- 方法2:调换比较运算符,保持DATEADD的顺序 SELECT * FROM [myDB].[dbo].[myTable] WHERE [CreatedDate] <= DATEADD(day,-30,GETDATE()) AND [CreatedDate] >= DATEADD(day,-60,GETDATE())
这样就会查询到60天前到30天前之间的历史数据了。
内容的提问来源于stack exchange,提问作者MattHodson
相关产品推荐
相关产品推荐

