在这个TSQL存储过程中,进行日期计算的正确方法是什么?
这是我的商业案例:我需要根据用户输入的“BegDate”和“EndDate”的日期值来确定另外两个日期。具体来说,我需要知道:在这个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
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语句用分隔代码>。