我有这样的数据:
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。因此,来自worked_date的来自2013-09-25 to 2013-10-01的所有数据都将weekCount作为1,而来自2013-10-02 to 2013-10-8的数据将有weekCount作为2,依此类推。怎样才能做到呢?
谢谢。
发布于 2013-10-07 01:38:14
也许像这样的方法可以解决你的问题。
我计算了一个内存中的表,其中包含了一周的边界以及一个单调增长的数字(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-06 22:38:01
这里有一种使用DATEDIFF的方法
select id,
worked_date,
1 + (datediff(day, '2013-09-25', worked_date) / 7) weekCount
from yourtable发布于 2013-10-06 23:48:01
如果您正在寻找财政周号,我将使用一个计算周数的函数:
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周的时间。
使用一个函数可以让您有更多的灵活性来做任何您需要的事情。
https://stackoverflow.com/questions/19214767
复制相似问题