在SQL中按月获取所有记录

时间:2018-11-05 16:12:56

标签: sql sql-server

我正在尝试从显示未来90天记录的视图中提取记录。我需要一种仅按月提取那些记录的方法。我需要这样做,因为并非所有月份都包含30天。以下示例显示了从今天开始以及未来30天的记录。

select * 
from [dbo].[vPolicy_Renewal_90DayLookUp] AS PRD 
where PRD.ExpDate BETWEEN GETDATE() AND DATEADD(DD, 30, GETDATE()) 
order by PRD.ExpDate 

这将获取今天和未来30天的所有记录,但是,我想要一种捕获该月所有记录的方法。由于是11月,所以前5天和该月的其余时间。

3 个答案:

答案 0 :(得分:1)

这是当前月份的查询:

SELECT *
FROM [dbo].[vPolicy_Renewal_90DayLookUp] AS PRD
WHERE
    PRD.ExpDate >= DATEADD(mm, DATEDIFF(mm, 0, @mydate), 0) AND
    PRD.ExpDate < DATEADD(mm, 1, DATEADD(mm, DATEDIFF(mm, 0, @mydate), 0));

第二个月,请使用以下WHERE子句:

WHERE
    PRD.ExpDate >= DATEADD(mm, 1, DATEADD(mm, DATEDIFF(mm, 0, @mydate), 0)) AND
    PRD.ExpDate < DATEADD(mm, 2, DATEADD(mm, DATEDIFF(mm, 0, @mydate), 0));

并在第三个月及以后的几个月中继续这种方式。如果您只想查询当前和未来两个月的信息,请使用以下方法:

SELECT *
FROM [dbo].[vPolicy_Renewal_90DayLookUp] AS PRD
WHERE
    PRD.ExpDate >= DATEADD(mm, DATEDIFF(mm, 0, @mydate), 0) AND
    PRD.ExpDate < DATEADD(mm, 3, DATEADD(mm, DATEDIFF(mm, 0, @mydate), 0))
ORDER BY
    PRD.ExpDate;

您应该分别查看三个月中从最早的记录到最新的记录。

答案 1 :(得分:0)

将其作为答案而不是评论-将根据“本月”的每一天返回给定月份的所有行

SELECT *
FROM [dbo].[vPolicy_Renewal_90DayLookUp] AS PRD
WHERE 
    DATEPART(MONTH,PRD.ExpDate) = DATEPART(MONTH,GetDate())
    AND DATEPART(YEAR, PRD.ExpDate) = DATEPART(YEAR, GETDATE())

添加: 根据{{​​3}}

,您可能需要在ExpDate字段上建立索引

答案 2 :(得分:0)

@Tim Biegeleisen我发现了一些答案。我尝试使用SQL month()函数,但是由于数据库中较早的转换,它将永远不会执行。这就解释了为什么@JonTout答案将无法正常工作。通过这种方式,我能够实现自己想要的。

DECLARE @mydate DATE, @myEndDate DATE;
SET @mydate = '12/01/2018';
SET @myEndDate = '12/31/2018';
SELECT *
FROM [dbo].[vPolicy_Renewal_90DayLookUp] AS PRD
WHERE  PRD.ExpDate >= DATEADD(mm, DATEDIFF(mm, 0, @mydate), 0) AND
PRD.ExpDate < DATEADD(mm, 1, DATEADD(mm, DATEDIFF(mm, 0, @myEndDate), 0))

order by ExpDate

感谢您@Tim Biegeleisen的帮助。我找到了解决我遇到的问题的另一种方法。这将显示当月的所有记录,并允许我创建一个存储过程,以便用户选择接下来90天要使用的月份。

DECLARE @Diff Int
Set @Diff = 0

SELECT PRD.Client, PRD.ExpDate
FROM [dbo].[vPolicy_Renewal_90DayLookUp] AS PRD

where (Year(ExpDate) = YEAR(getdate()))  
AND DATENAME(month, ExpDate) = DATENAME(MONTH, (Dateadd(Month, @Diff,GETDATE())))

order by ExpDate asc

如果没有year(),我可以做同样的事情,但是,它现在可以工作了。我发现这种方式对我来说更有意义。