SQL - 从机器中选择当前日期并与前一周进行比较

时间:2016-09-05 17:07:34

标签: sql sql-server tsql

以下查询

Sum(CASE WHEN dbo.sales.date BETWEEN '2016-07-17' AND '2016-07-23' THEN dbo.sales.sellinc END) AS ActualSales

而不是硬编码日期。我想从机器中选择当前日期并进行比较

Sum(CASE WHEN dbo.sales.date BETWEEN '**previous week (31 week 2016)**' AND '**Last year same week (31 week 2015)**' THEN dbo.sales.sellinc END) AS ActualSales

周从星期日开始,到星期六结束。有什么帮助吗?

3 个答案:

答案 0 :(得分:2)

我认为这个片段可能会帮助您从前一周到去年一年的范围。

Sum(CASE 
WHEN dbo.sales.date 
  BETWEEN DATEADD(YEAR, -1, DATEADD(WEEK, -1, GETDATE())) AND 
    DATEADD(WEEK, -1, GETDATE()) THEN dbo.sales.sellinc END) AS ActualSales

如果您想将星期五视为例外,您也可以修改逻辑。 在这种情况下,您必须使用 DATEPART(WEEKDAY,GETDATE())函数来获取周日,其中周日返回1,周六返回7。如果将日期生成逻辑移动到变量然后使用它来选择数据,那将更漂亮。

答案 1 :(得分:2)

其他人已经注意到您的周编号方法会影响您的解决方案。这是一个只查找当周星期日然后减去​​52周的人。 (您也可以在上一步骤中扣除364天,并仅使用dateadd一次。)因此,与前一年的一周的对应关系基本上是当年星期日的最近日历日期。

with dates as (
    select
        dateadd(week, -52,
            dateadd(day,
                1 - datepart(weekday, getdate()), /* Sunday of current week */
                cast(getdate() as date)
            )
        ) as WeekStartY-1,
        dateadd(day, 1 - datepart(weekday, cast(getdate() as date)) as WeekStartY-0
)
select
    sum(case when cast(s."date" as date)
             between d.WeekStartY-0 and dateadd(day, 6, WeekStartY-0) then s.sellinc end
    ) as ActualSalesY-0,
    sum(case when cast(s."date" as date)
             between d.WeekStartY-1 and dateadd(day, 6, WeekStartY-1) then s.sellinc end
    ) as ActualSalesY-1,
from dbo.Sales s cross apply dates d;

这可能偶尔会产生一种奇怪的现象。它发生在2012年12月30日星期日或星期一闰年结束时。2012年12月30日的Y-1是2012年1月1日。但考虑到那个星期的大部分时间实际上都在2013年和从这个角度来看,对应是有道理的。

答案 2 :(得分:0)

您可以尝试使用DATEADD

SUM(CASE WHEN dbo.sales.date BETWEEN DATEADD(week, 30, '2016/01/01') AND
    DATEADD(week, 30, '2015/01/01')
         THEN dbo.sales.sellinc END) AS ActualSales

这将为您提供2015年至2016年第30周之间的一年范围,使用SQL Server周,其第一周从1月1日开始,无论当天如何。如果你真的想使用ISO周,那么it will be a lot more work