2014-09-10 92 views
0

我在我的項目中有一個存儲過程,它返回從今天的日期到未來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

回答

0

這是基於我更好地瞭解你的目標的另一種方法。我使用公共表格表達式來設置一個表格,該表格提供了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

0

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

0

如果我理解正確,您想知道如何將日期參數添加到您的存儲過程。然後你想在程序中使用提供的日期而不是今天的日期。

這不是太難的事:

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

0

所以,按照我的理解應該是這樣的:

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 
相關問題