开发者社区> 问答> 正文

如何选择过去一年的过去7天及其对应的一周

我该如何选择

过去一周 前一年的对应天数 这是仪表盘所必需的,我想显示一个图表,其中包含过去7天的结果。如果我们的呼叫中心在一定时间内处理了98%的电话,则显示为绿色;如果超过98%,则显示为红色。作为参考,我想在下面创建一个图表,其中包含前一年的相应7天。这具有挑战性,因为工作日确实会影响工作量。这意味着我无法将星期二与星期日或星期一进行比较。

例如,今天是2019年12月21日星期六,我想报告以下时间跨度:

2019-12-13 00:00:00-> 2019-12-20 23:59:59 和 2018-12-14 00:00:00- > 2018-12-21 23:59:59

我编写了以下代码(在select语句中使用):

case when cs.ReachedAt between (getdate() - 7) and getdate() then 1 else 0 end as Is_PastWeek

case when cs.ReachedAt between (convert(datetime, convert(varchar(50), convert(date, dateadd(d, -1, dateadd(wk, -52, getdate())))) + ' 23:59:59')) and (convert(datetime, convert(varchar(50), convert(date, dateadd(d, -8, dateadd(wk, -52, getdate())))) + ' 00:00:00')) then 1 else 0 end as Is_SameWeekLastYear

它有效,但不是完美的。我只是选择与52周前同一周的相应工作日。这意味着我有时最终会选择匹配的工作日,而不是最近的工作日。我该如何做得更好?

编辑

为了阐明“选择上一年中最近的对应工作日”的意思,我举了以下示例:

with cte1 as (
select row_number() over (order by (select 1)) - 1 as incrementor
  from master.sys.columns sc1
 cross join master.sys.columns sc2
), cte2 as (
select dateadd(day, cte1.incrementor, '2000-01-01') as generated_date
  from cte1
 where dateadd(day, cte1.incrementor, '2000-01-01') < getdate()
), cte3 as (
select convert(date, generated_date) as generated_date     
     , convert(date, getdate()) as now_date
  from cte2
), cte4 as (
select * 
     , convert(date, dateadd(YEAR, -1, now_date)) as year_back
  from cte3
)
select now_date
     , generated_date
  from cte4 
 where 1=1
   and datepart(week, year_back) = datepart(week, generated_date)
   and datepart(DW, year_back) = datepart(DW, generated_date)

展开
收起
祖安文状元 2020-01-05 14:27:36 422 0
1 条回答
写回答
取消 提交回答
  • 该表达式datepart(week, getdate())将为您提供日历周。有了这个,您可以走得更远。

    2020-01-05 14:27:47
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
南瓜电影 7天内全面Serverless 化实践 立即下载
低代码开发师(初级)实战教程 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载