我正在使用SQL Server 2008 R2
。
我有一个stored procedure
我正在传递two parameters
- Month
和Year
。 default
NULL
都是Month
。
逻辑是Year
和NULL
是NULL
,然后从表中获取上个月的记录。例如,今天是2014年3月5日,如果将月份和年份作为specific
传递,则存储过程将返回上个月的记录,即2014年2月1日至2014年2月28日。
如果我传递Month
Year
和CREATE 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 null
为previous
,那么我需要在one day less
月的this month
月内将@Day = 22, @Month = null, @year = null
月的当天的记录提取到February 22nd - March 21st 2014
。
例如,如果{{1}}(今天是2014年3月22日),则会获取{{1}}的数据。
现在请告诉我在上面给出的存储过程中我应该对这个可选参数做些什么改变,并根据它设置日期范围?
由于
答案 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