SQL Server 2008中“上个月”的关键字

时间:2015-02-06 15:12:35

标签: sql sql-server sql-server-2008 date

我有一个查询(粘贴在下面),我想这样做,以便人们不需要更新完成的日期范围。我希望它能自动获得上个月的结果。例如,如果它在2月份运行,它将为我提供符合我1月标准的所有已完成项目的结果。谁能想到办法呢?

select  External_ID__c, 
        Ewrk_Tracking_Number__c,
        PIF_Branch_Name, 
        Distribution_Branch_Name, 
        Transaction_Type__C, 
        submitter_date__c, Completed_Date__C, 
        COUNT(External_ID__c)
from Business_Solutions_D.dbo.Reporting_SalesForce_AspireBaseData
where  PIF_Branch_Code = 977
    and Completed_Date__C >= '2015-01-01'
    and Completed_Date__C < '2015-02-01'
    and Delete_Flag__C = 'FALSE'
group by External_ID__c, 
         Ewrk_Tracking_Number__c, 
         PIF_Branch_Name, 
         Distribution_Branch_Name, 
         Transaction_Type__C,
         submitter_date__c,
         Completed_Date__C

4 个答案:

答案 0 :(得分:2)

上个月没有“关键字”。你必须把它放在你的谓词中。

以下是如何为此获取某些日期值的示例。

select dateadd(MONTH, datediff(MONTH, 0, GETDATE()), 0) as BeginningOfThisMonth
select dateadd(MONTH, datediff(MONTH, 0, GETDATE()) - 1, 0) as BeginningOfPreviousMonth

如果你想在这里看到许多其他日期例程,那么这是一篇很棒的博文,其中包含很多日期例程。 http://www.sqlservercentral.com/blogs/lynnpettis/2009/03/25/some-common-date-routines/

答案 1 :(得分:0)

如果您的意思是在此之前的最后一个月,您可以分两步完成:首先,找到当月的第一天

@firstDayOfThisMonth = DATEADD(day, DAY(GETDATE())-1, GETDATE())

然后减去一个月:

@firstDayOfLastMonth = DATEADD(month, -1, @firstDayOfThisMonth)

然后你的查询将是:

and Completed_Date__C >= @firstDayOfLastMonth
and Completed_Date__C < @firstDayOfThisMonth

另一种方法是查询Completed_Date__C与当前日期之间的差异(以月为单位)为1:

and DATEDIFF(Completed_Date__C, GETDATE()) = 1

答案 2 :(得分:0)

您可以使用日期算术执行此操作。获得该月的第一个日期的一个技巧是从该日期减去该月的当前日期并添加一天。 SQL Server允许您在+值上使用-dateadd()而不是datetime执行此操作。当然,您还需要删除时间组件(使用cast( as date))。

当前月份的逻辑如下:

where Completed_Date__C >= cast(getdate() - day(getdate()) + 1 as date) and
      Completed_Date__C < dateadd(month, 1, cast(getdate() - day(getdate()) + 1 as date))

和上个月一样:

where Completed_Date__C >= dateadd(month, -1, cast(getdate() - day(getdate()) + 1 as date)) and
      Completed_Date__C < cast(getdate() - day(getdate()) + 1 as date)

这有一个很好的属性,它可以像你的原始代码一样,所以它会利用列上的索引,如果合适的话。

答案 3 :(得分:0)

你只需要做一些日期数学来计算它。

--Go to last day of prev month - 'Day' to account for varying month day counts
and Completed_Date__C >= GETDATE() - DATEPART(DAY, GETDATE()) - DATEPART(DAY, GETDATE() - DATEPART(DAY, GETDATE())) + 1
and Completed_Date__C < GETDATE() - DATEPART(DAY, GETDATE()) + 1

当您在DateTimes +整数上添加时,它会假定它基于日期添加。