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

时间:2013-10-03 00:16:51

标签: asp.net sql gridview

我想创建一个存储过程,我可以逐周选择数据。如何才能做到这一点?这是我的情况,员工每天填写时间表,每周三早上每周付款。所以星期三是本周的第一天。我想在gridview中显示数据。在我的gridview中,gridview中的每个页面应代表员工每周工作。例如,如果有7条记录,今天是2013年10月2日星期三,以及过去7天内每天的每条记录,那么

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

  2. 第二个最早的记录于2013年9月26日输入

  3. 2013年9月27日输入了第三个最早的记录......

  4. 2013年10月1日输入了第7个最早的记录

  5. 在我的gridview中,我想在第1页上显示,记录仅限于9月25日至10月1日。这种方式将gridview页面按星期分组,星期三作为一周的第一天。我希望我能理解我的观点。

    感谢您的帮助。

    从评论中复制

    以下是我如何根据working_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 
    

1 个答案:

答案 0 :(得分:1)

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

 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

由于