0

我有这个数据:

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。因此,所有带有 working_date from 的数据都2013-09-25 to 2013-10-01将为weekCount1,而 from的数据2013-10-02 to 2013-10-8将为weekCount2,依此类推。怎么可能呢?

谢谢。

4

4 回答 4

3

这是一种使用方法DATEDIFF

select id, 
    worked_date, 
    1 + (datediff(day, '2013-09-25', worked_date) / 7) weekCount 
from yourtable
于 2013-10-06T22:38:01.660 回答
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

于 2013-10-07T01:38:14.687 回答
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',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  employee_id=@employee_id 
 AND weekRank=@weekRank
 ORDER BY worked_date  DESC

谢谢

于 2013-10-07T19:56:24.107 回答
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

如果您使用“2013-09-25”的财政开始日期和“2014-09-25”的评估日期,您将获得周数 1。

使用函数可以让您更灵活地做任何您需要的事情。

于 2013-10-06T23:48:01.030 回答