存储过程,返回startdate作为月初

时间:2017-05-03 11:48:54

标签: sql-server stored-procedures

我对SQL很新,但我正在编辑一个我们拥有的存储过程,这样我们就不需要手动输入@StartDate和@EndDate值了。 代码如下。基本上我希望StartDate是上个月的开始,EndDate是当前日期。 这可能很简单,但我找不到任何与我们的问题相关的在线内容。

USE [OnlineOrdering]
GO

DECLARE @return_value int

EXEC    @return_value = [dbo].[usp_GetPayPalOrders]
        @StartDate = N'2017-01-01 00:00:00',
        @EndDate = N'2017-01-31 23:59:59'

SELECT  'Return Value' = @return_value
GO

请注意,我最初没有写过这个程序,我希望能够自动化日期以使其更容易运行。

谢谢

2 个答案:

答案 0 :(得分:1)

要获得上个月的第一天,请执行以下操作:

  

SELECT DATEADD(月,-1,DATEADD(mm,DATEDIFF(m,0,GETDATE()),0))

所以,你的代码是:

USE [OnlineOrdering]
GO

DECLARE @firstDayLastMonth datetime = DATEADD(month,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE()), 0)), @now datetime = GETDATE()
DECLARE @return_value int

EXEC @return_value = [dbo].[usp_GetPayPalOrders]
    @StartDate = @firstDayLastMonth,
    @EndDate = @now

SELECT  'Return Value' = @return_value
GO

答案 1 :(得分:1)

您可以使用EOMONTH获取特定日期的最后一个月,例如:

SELECT EOMONTH(GETDATE())

将返回2017-05-31

该函数接受月份偏移作为第二个参数。您可以使用以下命令获取上个月的最后一天:

SELECT EOMONTH(GETDATE(),-1)

EOMONTH适用于所有受支持的SQL Server版本,即2012及更高版本。

在你的情况下,你可以写:

declare @start date EOMONTH(GetDate(),-1), @end date = GetDate()

EXEC    @return_value = [dbo].[usp_GetPayPalOrders] @start, @end

如果日期存储为...日期,即使用date类型或datetime没有时间组件,这将有效。如果没有,您将不得不向@end添加时间偏移,例如:

declare @start date=getdate(), @endDay datetime=cast(getdate()  as date)
declare @end datetime = @endDay + cast('23:59:59' as datetime)