以下查询
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
周从星期日开始,到星期六结束。有什么帮助吗?
答案 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。