使用存储过程中的查询来获取记录的条件参数

时间:2014-03-05 06:20:06

标签: sql sql-server-2008 sql-server-2005 sql-server-2008-r2

我正在使用SQL Server 2008 R2

我有一个stored procedure我正在传递two parameters - MonthYeardefault NULL都是Month

逻辑是YearNULLNULL,然后从表中获取上个月的记录。例如,今天是2014年3月5日,如果将月份和年份作为specific传递,则存储过程将返回上个月的记录,即2014年2月1日至2014年2月28日。

如果我传递Month YearCREATE PROCEDURE [dbo].[Proc_SalesRecords] (@Month INT = NULL, @year INT = NULL) AS BEGIN DECLARE @dtnow DATETIME = GETDATE() IF @Month IS NULL SELECT @Month = MONTH(DATEADD(MONTH, -1, @dtnow )) IF @Year IS NULL SELECT @year = YEAR(DATEADD(MONTH, -1, @dtnow )) SELECT * FROM SalesRecords WHERE ISNULL(@Month, MONTH(CreatedDate)) = MONTH(CreatedDate) AND ISNULL(@year, YEAR(CreatedDate)) = YEAR(CreatedDate) AND IsDeleted=0 END GO ,那么它将从表格​​中获取该月份和年份的记录。

存储过程如下:

Day

现在,我有了新要求将新参数@Day INT = NULL传递给同一程序,即Day

如果NULL设置为@Day,则过程应按原样运行。但如果not nullprevious,那么我需要在one day less月的this month月内将@Day = 22, @Month = null, @year = null月的当天的记录提取到February 22nd - March 21st 2014

例如,如果{{1}}(今天是2014年3月22日),则会获取{{1}}的数据。

现在请告诉我在上面给出的存储过程中我应该对这个可选参数做些什么改变,并根据它设置日期范围?

由于

2 个答案:

答案 0 :(得分:0)

检查一下:

声明@Day int = 22

声明@lastMonthDate dateTime,@ IceDate datetime,@ ToDate datetime

设置@ lastMonthDate = dateadd(M,-1,GETDATE());

Set @ FromDate = Convert(date,convert(varchar,Year(@lastMonthDate))+' - '+ convert(varchar,MONTH(@lastMonthDate))+' - '+ convert(varchar,@ Day)) 设置@ToDate = Dateadd(M,1,@ FromDate)-1

选择@FromDate,@ Todate

答案 1 :(得分:0)

愿这个帮助

CREATE PROCEDURE [dbo].[Proc_SalesRecords] (@Day INT = NULL, @Month INT = NULL, @year INT = NULL)
AS
BEGIN

    DECLARE @dtnow DATETIME = GETDATE()

    IF @Month IS NULL
        SELECT @Month = MONTH(DATEADD(MONTH, -1, @dtnow ))

    IF @Year IS NULL
        SELECT @year = YEAR(DATEADD(MONTH, -1, @dtnow ))

    SELECT * FROM SalesRecords
    WHERE 
        ISNULL(@Month, MONTH(CreatedDate)) = MONTH(CreatedDate) 
        AND ISNULL(@year, YEAR(CreatedDate)) = YEAR(CreatedDate)  
        AND ((DAY(CreatedDate) BETWEEN ISNULL(@Day, DAY(CreatedDate)) AND DAY(DATEADD(DAY,-1,@dtnow))) OR (@Day IS NULL))
        AND IsDeleted=0 


END     
GO