在这个TSQL存储过程中,进行日期计算的正确方法是什么?

在这个TSQL存储过程中,进行日期计算的正确方法是什么?,tsql,stored-procedures,date-math,Tsql,Stored Procedures,Date Math,这是我的商业案例:我需要根据用户输入的“BegDate”和“EndDate”的日期值来确定另外两个日期。具体来说,我需要知道: Week1Begin (which is the value they enter for "BegDate") Week2End (which is the value they enter for "EndDate") Week1End (which is the value they enter for "BegDate" + 6 days) Week2Begin

这是我的商业案例:我需要根据用户输入的“BegDate”和“EndDate”的日期值来确定另外两个日期。具体来说,我需要知道:

Week1Begin (which is the value they enter for "BegDate")
Week2End (which is the value they enter for "EndDate")
Week1End (which is the value they enter for "BegDate" + 6 days)
Week2Begin (which is the value they enter for "BegDate" + 7 days)
注意,如果用户输入以下值:

BegDate = 12/27/2015
EndDate = 1/6/2016
…其他值需要计算为:

Week1End = 1/2/2016
Week2Begin = 1/3/2016
我有一个存储过程,它执行时会返回求和列中的所有null和0,可能是因为SP中没有包含日期数学。以下是SP的现状:

CREATE PROCEDURE [dbo].[duckbilledPlatypi]
    @Unit varchar(25),
    @BegDate datetime,
    @EndDate datetime
AS

DECLARE 
@Week1End datetime,
@Week2Begin datetime

Select Ind.Description,
    @BegDate  BegDate,
    @Week1End Week1End,
    @Week1End Week2Begin,
    @EndDate EndDate,
    SUM(CASE WHEN Ind.InvoiceDate BETWEEN @BegDate AND @Week1End THEN Ind.QtyShipped ELSE 0 END) 
Week1Usage,
    SUM(CASE WHEN Ind.InvoiceDate BETWEEN @Week2Begin AND @EndDate THEN Ind.QtyShipped ELSE 0 END) 
Week2Usage,
    SUM(CASE WHEN Ind.InvoiceDate BETWEEN @BegDate AND @Week1End THEN Ind.Price ELSE 0 END) 
Week1Price,
    SUM(CASE WHEN Ind.InvoiceDate BETWEEN @Week2Begin AND @EndDate THEN Ind.Price ELSE 0 END) -
   SUM(CASE WHEN Ind.InvoiceDate BETWEEN @BegDate AND @Week1End THEN Ind.QtyShipped ELSE 0 END) 
UsageVariance,
    SUM(CASE WHEN Ind.InvoiceDate BETWEEN @Week2Begin AND @EndDate THEN Ind.QtyShipped ELSE 0 END) 
 -
    SUM(CASE WHEN Ind.InvoiceDate BETWEEN @BegDate AND @Week1End THEN Ind.Price ELSE 0 END) 
PriceVariance,
    (SUM(CASE WHEN Ind.InvoiceDate BETWEEN @Week2Begin AND @EndDate THEN Ind.QtyShipped ELSE 0 
END)  -
    SUM(CASE WHEN Ind.InvoiceDate BETWEEN @BegDate AND @Week1End THEN Ind.Price ELSE 0 END) )
    / 
NULLIF(SUM(CASE WHEN Ind.InvoiceDate BETWEEN @BegDate AND @Week1End THEN Ind.Price ELSE 0 END),0) 
PercentageOfPriceVariance
    From    InvoiceDetail Ind
    Where   Ind.Unit = @Unit
    AND Ind.InvoiceDate BETWEEN @BegDate AND @EndDate
    Group By Ind.Description
我需要添加什么来执行所需的日期计算?大概是这样的:

. . .
Select Ind.Description,
    @BegDate  BegDate,
    DATE_ADD(BegDate,INTERVAL 6 DAY) Week1End,
    DATE_ADD(BegDate,INTERVAL 7 DAY)  Week2Begin,
    @EndDate EndDate,
. . .
.
.
Select Ind.Description,
    @BegDate  BegDate,
    DATEADD(day, 6,@BegDate)  Week1End,
    DATEADD(day, 7,@BegDate)  Week2Begin, 
    @EndDate EndDate,

.
.
或者这个:

. . .
DECLARE 
@Week1End datetime = DATE_ADD(BegDate,INTERVAL 6 DAY),
@Week2Begin datetime = DATE_ADD(BegDate,INTERVAL 7 DAY)
. . .
…还是

更新 好,这个,

DECLARE @Week1End datetime = DATEADD(Day, 6, @BegDate),
@Week2Begin datetime = DATEADD(Day, 7, @BegDate);
……或者:

DECLARE @Week1End datetime = DATEADD(Day, 6, @BegDate),
@Week2Begin datetime = DATEADD(Day, 7, @BegDate)
DECLARE @Week1End datetime = DATEADD(Day, 6, @BegDate);
DECLARE @Week2Begin datetime = DATEADD(Day, 7, @BegDate);
……或者:

DECLARE @Week1End datetime = DATEADD(Day, 6, @BegDate),
@Week2Begin datetime = DATEADD(Day, 7, @BegDate)
DECLARE @Week1End datetime = DATEADD(Day, 6, @BegDate);
DECLARE @Week2Begin datetime = DATEADD(Day, 7, @BegDate);
…现在是(子)问题

更新2 它是这样工作的:

DECLARE 
@Week1End datetime = DATEADD(Day, 6, @BegDate),
@Week2Begin datetime = DATEADD(Day, 7, @BegDate);

是否只添加日期

DECLARE @BeginDatePlus6 datetime = DATEADD(dd, 6, begDate)

是否只添加日期

DECLARE @BeginDatePlus6 datetime = DATEADD(dd, 6, begDate)

我想你正在寻找这样的东西:

. . .
Select Ind.Description,
    @BegDate  BegDate,
    DATE_ADD(BegDate,INTERVAL 6 DAY) Week1End,
    DATE_ADD(BegDate,INTERVAL 7 DAY)  Week2Begin,
    @EndDate EndDate,
. . .
.
.
Select Ind.Description,
    @BegDate  BegDate,
    DATEADD(day, 6,@BegDate)  Week1End,
    DATEADD(day, 7,@BegDate)  Week2Begin, 
    @EndDate EndDate,

.
.

我想你正在寻找这样的东西:

. . .
Select Ind.Description,
    @BegDate  BegDate,
    DATE_ADD(BegDate,INTERVAL 6 DAY) Week1End,
    DATE_ADD(BegDate,INTERVAL 7 DAY)  Week2Begin,
    @EndDate EndDate,
. . .
.
.
Select Ind.Description,
    @BegDate  BegDate,
    DATEADD(day, 6,@BegDate)  Week1End,
    DATEADD(day, 7,@BegDate)  Week2Begin, 
    @EndDate EndDate,

.
.


看起来我需要听取第三位TSQL专家的意见;一只猫说一件事,另一只猫说另一件事……Shantanu Gupta给出的答案也与我建议的不同方法相同。我不怀疑你的语法,我只是想知道日期数学/操作需要去哪里——你指示(在Select语句中)或另一只猫指示(在var声明中)哪里。这两个都是我的想法,我不知道我更喜欢哪一个。这是一个选择的问题。但我会像另一只猫那样使用它,因为这样可以减少select语句中的性能开销;一只猫说一件事,另一只猫说另一件事……Shantanu Gupta给出的答案也与我建议的不同方法相同。我不怀疑你的语法,我只是想知道日期数学/操作需要去哪里——你指示(在Select语句中)或另一只猫指示(在var声明中)哪里。这两个都是我的想法,我不知道我更喜欢哪一个。这是一个选择的问题。但我会像另一只猫那样使用它,因为这样可以减少select语句中的性能开销;一只猫说一件事,另一只说另一件事。@B.ClayShannon我期待着不同的事情。不过,您的要求似乎很相似。看起来我需要听取第三位TSQL专家的意见;一只猫说一件事,另一只说另一件事。@B.ClayShannon我期待着不同的事情。然而,你们的要求似乎相似。。明确地这个问题太琐碎了,无法回答一个拥有近10000名代表的人;我的问题是在哪里使用它。下面的两只猫帮了我。我的大部分观点都来自C#,当然不是TSQL。你想在另一个日期上再加6天吗
DATEADD(第6天)
。你的第二个建议(或这一建议)就是你要做的。声明weekbegin、weekend变量并初始化它们。例如
声明@Week1End DATETIME=DATEADD(第6天,@BegDate)等等。关于风格问题,我更喜欢每行一个声明,每个SQL语句用
分隔。。明确地这个问题太琐碎了,无法回答一个拥有近10000名代表的人;我的问题是在哪里使用它。下面的两只猫帮了我。我的大部分观点都来自C#,当然不是TSQL。你想在另一个日期上再加6天吗
DATEADD(第6天)
。你的第二个建议(或这一建议)就是你要做的。声明weekbegin、weekend变量并初始化它们。例如
声明@Week1End DATETIME=DATEADD(第6天,@BegDate)等等。关于风格问题,我更喜欢每行一个声明,每个SQL语句用
分隔