通过将星期三设置为一周的第一天,逐周选择数据



我想创建一个可以每周选择数据的存储过程。如何做到这一点?这是我的情况,员工每天填写时间表,每周三早上付款。所以星期三是一周的第一天。我想在网格视图中显示数据。在我的网格视图中,网格视图中的每一页都应表示员工每周的工作。例如,如果有 7 条记录,今天是 2013 年 10 月 2 日星期三,并且过去 7 天内的每一天都有每条记录,则

  1. 最早的记录是在2013年9月25日进入的,

  2. 第二古老的记录是在2013年9月26日进入

  3. 第三古老的记录是在2013年9月27日进入

  4. 的......
  5. 2013年10月1日创下第七大纪录

在我的网格视图中,我想在第 1 页上显示仅 9 月 25 日至 10 月 1 日的记录。这是一种按周对网格视图页面进行分组,星期三作为一周的第一天。我希望我能表达我的观点。

谢谢你的帮助。

从评论中复制

以下是我根据worked_date确定一周的开始和结束日期的方法:

SELECT *
, dateadd(week, datediff(day,'20000105',worked_date) / 7, '20000105') AS WeekStart
, dateadd(week, datediff(day,'20000105',worked_date) / 7, '20000105')+6 AS WeekEnd 
FROM Timesheet 

也许不是最优雅的方式,但这对我来说可以得到最高的排名数字:

 WITH CTE AS (
            SELECT employee_id, DENSE_RANK() OVER (ORDER BY DATEDIFF(DAY, ''20130925'', worked_date )/7 DESC) AS weekRank
            FROM Timesheet
            )
            SELECT TOP (1) weekRank  
            FROM CTE
            WHERE employee_id=@employee_id  
            ORDER BY weekRank DESC

这就是我创建 weekRank 列并动态传递参数的方法:

WITH rank_cte AS (
SELECT timesheet_id,employee_id, date_worked, 
    dateadd(week, datediff(day,'20000105',date_worked) / 7, '20000105')   AS WeekStart, 
    dateadd(week, datediff(day,'20000105',date_worked) / 7, '20000105')+6 AS WeekEnd,
    DENSE_RANK() OVER (ORDER BY 1 + DATEDIFF(DAY, '20130925', worked_date )/7 DESC) AS  weekRank
FROM Timesheet
)
 SELECT timesheet_id, worked_date, WeekStart, WeekEnd, weekRank 
 FROM rank_cte rc 
 WHERE  employee_id=@employee_id 
 AND weekRank=@weekRank
 ORDER BY worked_date  DESC

谢谢

最新更新