我在表格中有两列日期。一个日期代表预期日期,另一个日期代表作业完成。我想查询以获得完成的工作数量,包括当前年份的特定工作周数以及应该完成的工作周数。
因此,如果我将这两个列中的日期转换为几周:
wkx:7,7,7,8,8,9,10,10,10,10,11,11
wkf:7,8,10,10,12,13,14,15,16,17,18,19
响应应该像:
wk:7,8,9,10,11,12,13,14,15,16,17,18,19
numx:3,5,6,10,12,12,12,12,12,12,12,12,12
numf:1,2,2,4,4,5,6,7,8,9,10,11,12
我正在使用SQL Server 2005,甚至不知道如何在一个列中获得不同的周,如示例所示。
此致
答案 0 :(得分:0)
最简单的方法(?)可能是使用适当的数字来源生成周数间隔,然后根据周数进行条件聚合。系统表master..spt_values
有一个可用于周数的列,expected
和finished
日期的周数可以使用datepart(wk, expected)
提取,但这可以给出一些奇怪的结果所以我建议使用this excellent answer中的dbo.f_isoweek()
函数。
功能:
CREATE function f_isoweek(@date datetime)
RETURNS INT
AS
BEGIN
RETURN (datepart(DY, datediff(d, 0, @date) / 7 * 7 + 3)+6) / 7
END
查询看起来像这样:
select
week = number,
numx = sum(case when dbo.f_isoweek(expected) = number then 1 else 0 end),
numf = sum(case when dbo.f_isoweek(finished) = number then 1 else 0 end),
from master..spt_values, your_table
where type='p' -- the type for the numbers in spt_values
-- limit to current year
and datepart(year, expected) = datepart(year, getdate())
and datepart(year, finished) = datepart(year, getdate())
group by number
-- limit weeks to available range (could be replaced with number between 1 and 53)
having number >= dbo.f_isoweek(min(expected)) and number <= dbo.f_isoweek(max(finished))
给出一个输入表,如:
expected finished
2015-01-05 2015-01-16
2015-01-06 2015-01-07
2015-01-18 2015-01-20
2015-01-25 2015-01-26
2015-01-26 2015-01-27
2015-02-08 2015-02-10
2015-02-10 2015-02-16
输出结果为:
week numx numf
2 2 1
3 1 1
4 1 1
5 1 2
6 1 0
7 1 1
8 0 1