2013-10-07 31 views
-2

我花了很多時間試圖弄清楚如何做到這一點,但做不到。所以請幫助我。動態獲取weekStart和weekEnd?

我有這樣的數據:

ID employee_id  worked_date  start_time  finish_time 
1  1   2013-09-25  09:00:00 17:30:00 
2  1   2013-09-26  07:00:00 17:00:00 
8  1   2013-10-01  09:00:00 17:00:00 
9  1   2013-10-04  09:00:00 17:00:00 
12 1   2013-10-07  09:00:00 17:00:00 
13 1   2013-10-10  09:00:00 17:00:00 
14 1   2013-10-11  09:00:00 17:00:00 

我一週的第一天是星期三。基準日期是2013年9月25日星期三。我需要能夠動態地獲取weekStart和weekEnd。例如,根據我上面提供的數據,2013年9月25日至2013年10月11日之間有三個星期。我先用最新的working_date命令我的數據。如果用戶請求第3周,則weekStart應爲2013-09-25,並且weekEnd應爲2013-10-01。如果用戶請求week2,那麼weekStart應該是2013-10-02到2013-10-08等等。

參數week將被動態傳遞。謝謝你的幫助。

這裏是我想要實現時所要求的每週3結果:

ID employee_id  worked_date  start_time  finish_time weekStart weekEnd 
1  1   2013-09-25  09:00:00 17:30:00  2013-09-25 2013-10-01 
2  1   2013-09-26  07:00:00 17:00:00  2013-09-25 2013-10-01 
8  1   2013-10-01  09:00:00 17:00:00  2013-09-25 2013-10-01 

使用該查詢會給我weekStart和週末爲每個記錄

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 

但我不想要這個。我只需要用戶請求的特定周。

+0

使用該查詢會給我weekStart和週末爲每個記錄SELECT * ,DATEADD(周,DATEDIFF(日, '20000105',worked_date)/ 7, '20000105')AS WeekStart ,DATEADD(周,DATEDIFF (day,'20000105',working_date)/ 7,'20000105')+ 6 AS WeekEnd FROM Timesheet。但我不想要這個。我只需要用戶請求的特定周。 – loveprogramming

+0

那麼你如何確定9-25-2013是第三個星期呢? – jcwrequests

+0

這是基於此查詢的第三週:WITH CTE AS( \t \t \t \t \t SELECT僱員,DENSE_RANK()OVER(ORDER BY DATEDIFF(DAY '' 20130925',worked_date)/ 7 DESC)AS weekRank \t \t \t \t \t FROM時間表 \t \t \t \t \t) \t \t \t \t \t SELECT TOP(1)weekRank \t \t \t \t \t FROM CTE \t \t \t \t \t WHERE僱員= @ EMPLOYEE_ID \t \t \t \t \t ORDER BY weekRank DESC。我倒計數以確定自2013-09-25以來該員工迄今爲止工作了多少周。 – loveprogramming

回答

2

這聽起來像你可能需要一個日曆表。

create table calendar (
calendarId int identity(1,1) primary key, 
year int, 
month int, 
week int, 
startDate date, 
endDate date) 

那麼你可以說「給我所有的記錄,每週2」

declare @week int = 2 
declare @year int = 2013 

;with employeeCalendar as (
    select 
    employee.employeeid 
    ,startDate 
    ,endDate 
    from 
    employee 
    cross apply 
    calendar 
    where 
    calendar.week = @week) 
select 
    employeeCalendar.EmployeeId 
,employeeShift.[date] 
,start_time 
,finish_time 
,startDate 
,endDate 
from 
    employeeCalendar 
left join 
    employeeShift 
on employeeShift.employeeid = employeeCalendar.employeeid 
and employeeShift.worked_date 
between employeeCalendar.startDate and employeeCalendar.endDate 

您可以填寫該表,像這樣的查詢:

;with calendarCte as (
select 
    1 as week 
,convert(date,'2013-09-25') as startDate 
,convert(date,'2013-10-01') as endDate 
union all 
select 
    week + 1 
,dateadd(week,1,startDate) 
,dateadd(week,1,endDate) 
from 
    calendarCte 
where 
    calendarCte.startDate < convert(date,'2043-09-25')) 
insert into calendar([year],[month],[week],startdate,stopdate) 
select 
    datepart(year,startDate) as [year] 
,datepart(month,startDate) as [month] 
,week as [week] 
,startDate 
,endDate 
from calendarCte option (maxrecursion 0) 
+0

邁克爾,我如何使用'2013-09-25'到'2013-10-01'作爲第一週和循環30年來填充表格。 – loveprogramming

+0

@asplearning,我已經添加了一個加載腳本。 – Michael

+0

對不起,這是我第一次像這樣填充表格。請向我展示一下如何使用上面的CTE,並根據您之前建議的表定義將其填充到日曆表中。 – loveprogramming

1

你說你是尋找一個存儲過程。你在找這樣的東西嗎?

CREATE PROCEDURE ProcedureName @week int AS 

SELECT * FROM Timesheet 
WHERE worked_date >= dateadd(week, @week, '2013-09-25') 
AND worked_date < dateadd(day,7,dateadd(week, @week, '2013-09-25')) 

如果你想要你的weekStart和weekEnd,你可以像你以前那樣將它們添加到SELECT中。

如果您想從當前的星期的降序到後退,您可以按如下方式編寫它。

CREATE PROCEDURE ProcedureName @week int AS 

SELECT * FROM Timesheet 
WHERE worked_date >= dateadd(week, [email protected], '2013-10-16') 
AND worked_date < dateadd(day,7,dateadd(week, [email protected], '2013-10-16')) 

你也可以參數要傳遞到存儲過程作爲當前星期總是會改變的日期。

+0

哈里森哈里森,我正在嘗試不同的選擇。除了一件事以外,你似乎工作。我有一個gridview,其中有三個頁面,代表了由working_date DESC提供的3個星期的順序。這意味着最新的記錄出現在第一頁上。因此,如果用戶點擊了第1頁,那實際上是WHERE working_date> = dateadd(week,2,'2013-09-25') AND worked_date = dateadd(week,0,'2013-09-25') AND worked_date loveprogramming

+0

@asplearning,如果你想看看星期回來的星期,你可以使用dateadd從當前星期減去。 「@周」值將是負值,日期將會是你正在考慮的本週的任何事情。 – Harrison

+0

請告訴我如何做@Harrison。 – loveprogramming