【问题标题】:Select data week by week by setting Wednesday as the first day of the week通过将星期三设置为一周的第一天,逐周选择数据
【发布时间】:2013-10-03 00:16:50
【问题描述】:

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

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

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

  3. 第三旧的记录于 2013 年 9 月 27 日进入 ...

  4. 第 7 长的记录于 2013 年 10 月 1 日进入

在我的网格视图中,我想在第 1 页显示仅从 9 月 25 日到 10 月 1 日的记录。这是一种按周对 gridview 页面进行分组的方式,周三是一周的第一天。我希望我能明白我的意思。

感谢您的帮助。

从评论中复制

以下是我如何根据工作日期确定一周的开始和结束日期:

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 

【问题讨论】:

  • sql server 函数 date(dw, yourdate) 将为您提供星期几从星期日开始的星期几。添加或减去它以获得星期三为 0 和星期二为 6 的值。这将帮助您入门。
  • 你好,丹,我可以得到星期几。如何每周对数据进行分组。 9 月 25 日至 10 月 1 日为一周。我可以在查询中指定 9 月 25 日到 10 月 1 日之间的工作日期。但这只会选择一周的数据。有没有办法可以逐周选择所有数据和分组。谢谢
  • 以下是我如何根据工作日期确定一周的开始和结束日期: 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
  • 大家好,我试图弄清楚这个的逻辑,这是我能想到的,但不知道如何编写查询。所以这里的逻辑是:今天是 2013 年 10 月 2 日 首先,我将 min(worked_date) 和 max(worked_date) 之间的周数作为整数并将其反映在我的 gridview 中。如果它是 gridview 上的第 2 页,我只想选择 date_worked 是从 9 月 25 日到 10 月 1 日的记录。如果是gridview上的第3页,我想选择9月18日到9月24日等等。谢谢。
  • 有人可以帮帮我吗?非常感谢。

标签: asp.net sql gridview


【解决方案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

谢谢

【讨论】:

    猜你喜欢
    • 2020-01-18
    • 2019-08-30
    • 1970-01-01
    • 2015-12-11
    • 1970-01-01
    • 2013-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多