【问题标题】:SQL - pick current date from machine and compare with previous weekSQL - 从机器中选择当前日期并与前一周进行比较
【发布时间】:2016-09-05 17:07:33
【问题描述】:

对于下面的查询

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

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

【问题讨论】:

    标签: sql sql-server tsql


    【解决方案1】:

    我认为这个 sn-p 可能会帮助您获得从前一周到去年的一年范围。

    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。如果您将日期生成逻辑移动到一个变量,然后使用它来选择您的数据,那会更漂亮。

    【讨论】:

    • Thanks@samrat-alamgir,请问下面场景的代码是什么?场景 1:` sum(当 s.Date 在 '2016-07-17' 和 '2016-07-23' 之间,然后 s.SELLINC 否则 0 结束时的情况)ActualSales` 场景 2:sum(case when s.Date between '2015-07-19' and '2015-07-25' then s.SELLINC else 0 end) LastYrVariance 场景 3:在开始之间选择日期从当年到今天的日期sum(case when s.Date between '2016-01-01' and '2016-09-05' then s.SELLINC else 0 end) YrToDateActual
    • 您是否要同时显示三个列,即实际销售额、去年差异和年初至今?你能再描述一下你的日期生成逻辑吗?
    【解决方案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 年。所以 2012 年 12 月 30 日的 Y-1 是 2012 年 1 月 1 日。但考虑到该周的大部分日子实际上是在 2013 年,而从这个角度来看,通信是有意义的。

    【讨论】:

    • Thanks@shawnt00,请问下面场景的代码是什么?场景 1:` sum(当 s.Date 在 '2016-07-17' 和 '2016-07-23' 之间,然后 s.SELLINC 否则 0 结束时的情况)ActualSales` 场景 2:sum(case when s.Date between '2015-07-19' and '2015-07-25' then s.SELLINC else 0 end) LastYrVariance 场景 3:在开始之间选择日期从当年到今天的日期sum(case when s.Date between '2016-01-01' and '2016-09-05' then s.SELLINC else 0 end) YrToDateActual 场景 4:sum(case when s.Date between '2015-01-01' AND '2015-09-05' then s.SELLINC else 0 end) LastYrToDateActual
    • @user2331670 我不知道七月的日期是从哪里来的。获得当年 1 月 1 日的一种方法是dateadd(day, datepart(dayofyear, getdate()) - 1, getdate())。我保证您只需稍作搜索即可轻松找到该解决方案。如果您根据所有要求编辑问题,那将是最好的。展示独立努力和失败的尝试在这个论坛上受到高度重视。在某些时候,完全创建一个新问题是最合适的。
    【解决方案3】:

    你可以试试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 年第 30 周和 2016 年之间的一年范围,使用 SQL Server 周,其第一周从 1 月 1 日开始,无论哪一天。如果你真的想使用 ISO 周,那么it will be a lot more work

    【讨论】:

      猜你喜欢
      • 2017-01-13
      • 2017-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-11
      • 2017-05-15
      • 1970-01-01
      相关资源
      最近更新 更多