如何在存储过程中设置自定义日期和操作数据?
我在我的项目中有一个存储过程,它返回从今天的日期到未来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
任何帮助,将不胜感激。
谢谢。
这是基于我更好地了解你的目标的另一种方法。我使用公共表格表达式来设置一个表格,该表格提供了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
您的解决方案工作。非常感谢你。 – Nirav 2014-09-10 15:57:40
不客气,@尼拉夫。请考虑将其标记为答案。 – 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
所以,按照我的理解应该是这样的:
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
是否要将开始日期作为始终为1/1/2014的参数? – 2014-09-10 14:29:40
是的,我想要开始日期始终是1/1/2014。 – Nirav 2014-09-10 14:45:08