这个修复日期分裂'bug'的安全吗?

时间:2011-01-09 20:56:19

标签: sql-server

我创建了一份报告,其中包含给定帐号的周末数字。我使用datepart函数按周分组,这很好,但是一个'bug'(引用因为我不确定它是一个bug还是正确的行为,但我不想要行为)会发生在年底。分组会将最后一周拆分为两行,并将其显示为两行(两者具有相同的周结束日期,但一个是第53周,另一周是1)所以我相应地修改了group by子句......

    group by 

(case when datepart(wk,dbdate) = 53 then (year(dbdate) + 1) else year(dbdate) end)

,(case when datepart(wk,dbdate) = 53 then 1 else datepart(wk,dbdate) end)

似乎有效。我用几个例子测试了它。但我只想确保a)它能在所有条件下工作,b)有更好的方法吗?

如果有帮助,这是整个查询...

set datefirst 1
select 
convert(varchar,min(DATEADD(dd, 7-(DATEPART(dw, dbdate)), dbdate)),106) [Week<br />Ending],
'$' + convert(VARCHAR,sum(handle),1) as Handle,

'$' + convert(varchar,sum(case when pool_type in ('WN','PL','SH','WP','WS','PS','WPS') then handle else 0 end),1) as WPS,

'$' + convert(varchar,sum(case when pool_type not in ('WN','PL','SH','WP','WS','PS','WPS') then handle else 0 end),1) as Exotics

 from amtoteaccountactivity 

where accountnumber ='$account'
and (_date >='$datestart' and _date <= '$dateend') 
and pool_type not in ('TT2','TS2','BQ2','SS2') and transaction_type ='Bet'
group by 

(case when datepart(wk,dbdate) = 53 then (year(dbdate) + 1) else year(dbdate) end)

,(case when datepart(wk,dbdate) = 53 then 1 else datepart(wk,dbdate) end)


order by min(DATEADD(dd, 7-(DATEPART(dw, dbdate)), dbdate))

编辑:这基本上做的是将第53周的结果与下一年的结果的第1周结合起来,从而重新组合分周。因为SQL引擎将第一年的最后一周计为下一年的“第1周”和前一年的第53周。

1 个答案:

答案 0 :(得分:1)

我们使用另一张表加入;在另一个表中我们有日历周(iso和我们),季度,月等。 连接仅使用日期部分完成。 group by然后通过其中一个附加列完成,这取决于报告(按周,按月等)

另一个表格填充一次,其值为100年,足以满足我们的要求。

表架构:

CREATE TABLE [dbo].[PeriodeDate](
[Id] [int] NOT NULL IDENTITY(1, 1),
[periodeDate] [datetime] NOT NULL,
[periodQuarter] [int] NULL,
[periodYear] [int] NULL,
[periodMonth] [int] NULL,
[calendarWeekISO] [int] NULL,
[YearOfCalendarWeekISO] [int] NULL,
[YearOfCalendarWeekUS] [int] NULL,
[calendarWeekUS] [int] NULL,
)

并记住,有几年有53! calendarweeks(ISO和US)