【问题标题】:Why do different date math operations produce the same value?为什么不同的日期数学运算会产生相同的值?
【发布时间】:2016-01-13 21:44:04
【问题描述】:

我可以在一个日期加上 6 天得到我期望的结果,但是如果我在同一个日期加上 7 天,我得到的是相同的日期。

我的意思是这个;当用户输入“12/27/2015”作为@BegDate 参数的值时,此声明:

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

...结果@Week1End 和@Week2Begin 都是同一日期(2016-01-02),从返回的结果集中可以看出:

这是 TSQL:

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

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

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

那么为什么 @BegDate + 6 等同于 @BegDate + 7

【问题讨论】:

    标签: sql-server tsql date-math


    【解决方案1】:
    @Week1End Week1End,
    @Week1End Week2Begin,
    

    再看这段代码……

    【讨论】:

    • 啊,就是这样;我之前修复了这个问题,然后另一个复制和粘贴作业将其恢复。我现在使用 LINQPad 删除和重新创建 SP,因为这比服务器资源管理器更容易。
    【解决方案2】:

    你确定:

    DECLARE @BegDate datetime = GETDATE()
    
    SELECT @BegDate, DATEADD(Day, 6, @BegDate), DATEADD(Day, 7, @BegDate);
    

    结果:

    我认为您的问题在这里:

    @Week1End Week1End,
    @Week1End Week2Begin, ---<<<<<--- 
    

    应该是:

    @Week1End Week1End,
    @Week2BeginWeek2Begin, ---<<<<<--- 
    

    【讨论】:

    • 我知道这似乎没有意义,但你可以看到我上面得到的结果:Week1End 和 Week2Begin 返回相同的值。
    猜你喜欢
    • 2012-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-20
    • 2021-11-23
    • 2018-07-03
    • 1970-01-01
    相关资源
    最近更新 更多