我有一个名为“dateadded
”的列表,每天我都要运行一个查询来获取完成8,18,28,38,48,58等月的每一行。
这就是我今天的方式:
select * from table
where DATEADD(month, DATEADDED , 8) = GETDATE()
or DATEADD(month, DATEADDED , 18) = GETDATE()
or DATEADD(month, DATEADDED , 28) = GETDATE() ...
但我不想使用100“or
”或更多。
有没有更好的方法呢?
答案 0 :(得分:5)
这可以使用DATEADDED
列上的索引(如果存在),或者将来应该添加一个索引。对列执行DATEDIFF()
等功能的解决方案直接阻止SQL Server甚至考虑索引,并强制它进行扫描(缺少任何其他谓词来限制搜索空间)。
CREATE TABLE #x(ID INT IDENTITY(1,1), DATEADDED DATETIME);
INSERT #x(DATEADDED) VALUES
('20130605 04:56'), -- 8 months ago
('20120805 23:59'), -- 18 months ago
('20111005 14:36'), -- 28 months ago
('20101105 04:23'); -- should not be found
;WITH cte AS
(
SELECT TOP (DATEDIFF(MONTH,'19990201',GETDATE())/10+1)
d = CONVERT(DATE,DATEADD(MONTH,-((number*10)-2),GETDATE()))
FROM master.dbo.spt_values WHERE [type] = N'P' AND number > 0 ORDER BY number
)
SELECT x.ID, x.DATEADDED
FROM #x AS x
INNER JOIN cte
ON x.DATEADDED >= cte.d
AND x.DATEADDED < DATEADD(DAY,1,cte.d);
答案 1 :(得分:1)
您可以尝试以下方式:
SELECT *
FROM table
WHERE DATEDIFF(month, DATEADDED , GETDATE()) % 10 = 8
AND DATEDIFF(month, DATEADDED , GETDATE()) < 100 -- ignore more than 100 months old
并使用DATEDIFF()
函数为您提供月偏移量,将其输入模数运算符以查找可接受的偏移量。