2013-10-06 42 views
0

一个weekCount列我有这样的数据:创建SQL Server 2012中

id worked_date 
-----------------  
1  2013-09-25 
2  2013-09-26 
3  2013-10-01 
4  2013-10-04 
5  2013-10-07 

我要添加一列名为weekCount。基础日期是2013-09-25。因此所有来自2013-09-25 to 2013-10-01的working_date数据将具有weekCount作为1,并且从2013-10-02 to 2013-10-8将具有weekCount作为2等等。如何做到这一点?

谢谢。

+0

实际上,您是否将此值存储在表格中,或者在需要确定范围时是否可以计算该值? – billinkc

回答

1

也许像这样的方法将解决您的问题。

我计算了一个内存表,其中包含了一周的边界以及单调递增的数字(BuildWeeks)。然后,我将我的worked_date值与我的日期边界进行比较。根据您对@sgeddes的评论,您需要反向星期编号,然后使用DENSE_RANK函数来计算ReverseWeekNumber

WITH BOT(StartDate) AS 
(
    SELECT CAST('2013-09-25' AS date) 
) 
, BuildWeeks (WeekNumber, StartOfWeek, EndOfWeek) AS 
(
    SELECT 
     N.number AS WeekNumber 
    , DateAdd(week, N.number -1, B.StartDate) AS StartOfWeek 
    , DateAdd(d, -1, DateAdd(week, N.number, B.StartDate)) AS EndOfWeek 
    FROM 
     dbo.Numbers AS N 
     CROSS APPLY 
      BOT AS B 
) 
SELECT 
    M.* 
, BW.* 
, DENSE_RANK() OVER (ORDER BY BW.WeekNumber DESC) AS ReverseWeekNumber 
FROM 
    dbo.MyTable M 
    INNER JOIN 
     BuildWeeks AS BW 
     ON M.worked_date BETWEEN BW.StartOfWeek ANd BW.EndOfWeek 
; 

SQLFiddle

+0

这正是我所期待的。最后一个问题,我如何选择最高排名?例如,如果我的数据中有4个等级。我想得到4作为整数。或者说简单一些,我想要统计返回的队伍数量。谢谢 – loveprogramming

+0

我想只计算独特的排名。谢谢你的帮助。 – loveprogramming

+0

你的最终产出会是什么样子?你对这个问题采取的零碎的方法在这里不受欢迎。提前说明您的所有需求,以免人们解决中间问题。 – billinkc

3

下面是使用DATEDIFF一个办法:

select id, 
    worked_date, 
    1 + (datediff(day, '2013-09-25', worked_date)/7) weekCount 
from yourtable 
+0

谢谢sgeddes,最后一件事情,可以通过设置weekCount将working_date从2013-09-25到2013-10-01的数据设置为2,并将工作日期从2013-10-02到2013的数据-10-8为1?如果有更多记录,则第一周记录的weekCount将会相应增加。谢谢 – loveprogramming

1

如果你正在寻找一个财政的周数,我会用一个函数,将计算一周:

CREATE FUNCTION FiscalWeek(@FiscalStartDate datetime, @EvalDate datetime) 
RETURNS INT 
AS 
BEGIN 
DECLARE @weekNumber INT = (DATEDIFF(DAY, @FiscalStartDate, @EvalDate)/7) + 1 

RETURN (@weekNumber % 52) 
END 
GO 

如果您使用财政s “2013-09-25”的排期日期和“2014-09-25”的评估日期将得到一周的数字1.

使用函数可为您提供更多的灵活性,以满足您的任何需求。

+0

Hello Cam,我正在研究员工每周支付的工资支付功能。星期三是一周的第一天,2013年9月25日星期三。所以我想每周显示我的数据。任何想法如何我可以使用函数为我的目的上面?谢谢 – loveprogramming

+0

你能举个例子吗?我不确定你想要完成什么。我用90年代的工资管理软件撰写工作,并在分类帐的末尾工作。我相信我们可以弄清楚什么。只需要更多的细节。 – Cam

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 [email protected]_id 
       ORDER BY weekRank DESC 

这是我如何创造weekRank柱和动态传递参数:

WITH rank_cte AS (
SELECT timesheet_id,employee_id, date_worked, 
     dateadd(week, datediff(day,'20000105',worked_date)/7, '20000105') AS WeekStart, 
     dateadd(week, datediff(day,'20000105',worked_date)/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 [email protected]_id 
AND [email protected] 
ORDER BY worked_date DESC 

谢谢