SQL每10个月选择一次

时间:2014-02-05 17:20:36

标签: sql sql-server select

我有一个名为“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”或更多。 有没有更好的方法呢?

2 个答案:

答案 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()函数为您提供月偏移量,将其输入模数运算符以查找可接受的偏移量。