如何在存储过程中设置自定义日期和操作数据?

问题描述:

我在我的项目中有一个存储过程,它返回从今天的日期到未来49天的总和。我想修改这个存储过程的方式是将2014-01-01作为开始日期并返回该日期的数据。举一个例子,如何在存储过程中设置自定义日期和操作数据?

Total_amount  StartDate EndDate 
50000   2014-01-01 2014-02-18 
40000   2014-02-19 2014-04-08 

这是我的存储过程,

USE [myDB] 
GO 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
-- ============================================= 
-- Author:  <Author,,Name> 
-- Create date: <Create Date,,> 
-- Description: <Description,,> 
-- ============================================= 
ALTER PROCEDURE [dbo].[my_sp] 

AS 
BEGIN 
    select sum(amount) as Total_amount, 
      getdate() as StartDate, 
      dateadd(dd, 48, dateadd(dd, -(datepart(dw, getdate())-2), getdate())) as EndDate 
    from my_table 
    where Col_Date > dateadd(dd, -1, getdate()) 
      and Col_Date < dateadd(dd, 49, dateadd(dd, -(datepart(dw, getdate())-2), getdate())) 
END 

任何帮助,将不胜感激。

谢谢。

+0

是否要将开始日期作为始终为1/1/2014的参数? – 2014-09-10 14:29:40

+0

是的,我想要开始日期始终是1/1/2014。 – Nirav 2014-09-10 14:45:08

这是基于我更好地了解你的目标的另一种方法。我使用公共表格表达式来设置一个表格,该表格提供了49天的“桶”,然后加入这个表格以总结合适的总数。

ALTER PROCEDURE [dbo].[my_sp] (@startdate datetime) 

AS 

BEGIN 
------------------------- 
-- Set up a table that lists off 49 day periods starting from @startDate 
------------------------- 

DECLARE @endDate DATETIME = getdate(); 

WITH [dates] ([startDate], [maxDate_Excluded]) AS 
    (SELECT 
      @startDate AS [startDate] 
      ,DATEADD(d, 49, @startDate) AS [maxDate_Excluded] 

    UNION ALL 
    SELECT 
      DATEADD(d, 49, [startDate]) AS [startDate] 
      ,DATEADD(d, 98, [startDate]) AS [maxDate_Excluded] 
    FROM [dates] 
    WHERE [startDate] < @endDate 
) 
, dateFrame AS 
( 
    SELECT 
      [startDate] 
      ,[maxDate_Excluded] 

    FROM [dates] 
) 


------------------------- 
-- JOIN and sum. 
------------------------- 
SELECT 
    [startDate] 
    , dateadd(d, -1, [maxDate_Exclued]) as endingDate 
    , Sum(amount) as total_amount 
FROM 
    dateFrame df 

    left join my_table mt 
     on mt.col_date >= df.startDate 
     and mt.col_date < df.maxDate_Excluded 
GROUP BY 
    [startDate] 
    ,[maxDate_Excluded] 
ORDER by 
    [startDate] 

END 
+0

您的解决方案工作。非常感谢你。 – Nirav 2014-09-10 15:57:40

+0

不客气,@尼拉夫。请考虑将其标记为答案。 – Greenspark 2014-09-10 16:25:22

getdate()函数返回今天的日期。因此,您可以将其更改为例如'2014-01-01'。

如果我理解正确,您想知道如何将日期参数添加到您的存储过程。然后你想在程序中使用提供的日期而不是今天的日期。

这不是太难的事:

ALTER PROCEDURE [dbo].[my_sp] (@startdate datetime) 

AS 
BEGIN 
    select sum(amount) as Total_amount,@startdate as StartDate,dateadd(dd,48,dateadd(dd,-(datepart(dw,@startdate)-2),@startdate)) as EndDate 
    from my_table 
    where Col_Date > dateadd(dd,-1,@startdate) 
     and Col_Date < dateadd(dd,49,dateadd(dd,-(datepart(dw,@startdate)-2),@startdate)) 
END 
+0

是的。但是我想要一个从@startdate开始的循环,并且直到今天还要继续添加49天。 – Nirav 2014-09-10 14:55:22

+0

什么?你为什么需要一个循环?如果你只是想要今天的所有日子,为什么要用循环呢? – 2014-09-10 14:57:08

+0

我有一个要求,从今年开始的所有49天的期限内获取total_amount。 – Nirav 2014-09-10 15:00:26

所以,按照我的理解应该是这样的:

ALTER PROCEDURE [dbo].[my_sp] 

AS 
BEGIN 
    select sum(amount) as Total_amount, 
      getdate() as StartDate, 
      dateadd(dd, 48, dateadd(dd, -(datepart(dw, getdate())-2), getdate())) as EndDate 
    from my_table 
    where Col_Date > '2014-01-01' 
END