怎么做按周统计(需要跨年份)

philipsslg 2004-12-27 09:45:01
如果不跨年份不难,跨年份怎么做,每周以星期一为开始,如果2004-12-27到2005-01-02为2005年第一周,那我要统计2005年1-10周的数据怎么统计??(还有好像SQL 2000 默认把岁末年初的一周分成了两周)
...全文
517 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
icedut 2004-12-28
  • 打赏
  • 举报
回复
--我用的方法比较本
--下面的函数GetDateFromWeekDay也是以前别人写的
/*
-- 得到一周的某一天
*/
create function GetDateFromWeekDay(@Year integer,@Week integer,@WeekDay integer)
RETURNS datetime
as
begin
return dateadd(day,-datepart(weekday,dateadd(week,@Week-1,dateadd(year,@Year -1900,0))) + @WeekDay,dateadd(week,@Week-1,dateadd(year,@Year -1900,0)))
end

-------------------------------------------
DECLARE @Week as int
DECLARE @DT1 as smalldatetime
DECLARE @DT2 as smalldatetime

set @Week=datepart(ww,@DT)
set @DT1= dbo.GetDateFromWeekDay(datepart(yy,@DT),@week,1)
set @DT2= dbo.GetDateFromWeekDay(datepart(yy,@DT),@week,7)
--@DT1是一周的开始时间,@DT2是一周的结束时间
--我这样修改后,反正我的系统是可以用了
icedut 2004-12-28
  • 打赏
  • 举报
回复
能不能给个函数输入时间得到是第几周???---datepart函数不是可以么


playyuer 2004-12-28
  • 打赏
  • 举报
回复
创建如下函数
group by 函数 即可

1.方法1
create function udf_WeekDay(@ int,@date datetime)
returns datetime
begin
/*
--周日算作周的最后一天
当 @ <= 1 代表将 @date 映射到 所在周的星期一
当 @ = 2 代表将 @date 映射到 所在周的星期二
当 @ = 3 代表将 @date 映射到 所在周的星期三
当 @ = 4 代表将 @date 映射到 所在周的星期四
当 @ = 5 代表将 @date 映射到 所在周的星期五
当 @ = 6 代表将 @date 映射到 所在周的星期六
当 @ >= 7 代表将 @date 映射到 所在周的星期日
可用于按周汇总 Group by,均支持跨年跨月数据
*/

return
(select dateadd(day
,case when (@@datefirst + datepart(weekday,@date)) % 7 = 0 --周六
then
case when @ between 1 and 6
then @ - 6
else 1
end
when (@@datefirst + datepart(weekday,@date)) % 7 = 1 --周日(七)
then
case when @ between 1 and 6
then @ - 7
else 0
end
when (@@datefirst + datepart(weekday,@date)) % 7 between 2 and 6 --周一至周五
then
case when @ between 1 and 6
then @ + 1 - (@@datefirst + datepart(weekday,@date)) % 7
else 8 - (@@datefirst + datepart(weekday,@date)) % 7
end
end
,@date))
end

go

2.方法2
create function udf_WeekDiff(@BeginDate datetime,@EndDate datetime)
returns integer
begin
return (
select datediff(week,@BeginDate,@EndDate) -- + 1
+ case when (@@datefirst + datepart(weekday,@BeginDate)) % 7 = 1 then 1 else 0 end
- case when (@@datefirst + datepart(weekday,@EndDate)) % 7 = 1 then 1 else 0 end
)
end

go

declare @b datetime,@e datetime
set @b = '2004-12-12'
set @e = '2004-12-20'


select dbo.udf_WeekDiff(@b,@e) + 1 as 跨周数
,dbo.udf_WeekDiff(@b,@e) as 间隔周数
,datediff(week,@b,@e) as [datediff(week,startdate,enddate)]
vinsonshen 2004-12-28
  • 打赏
  • 举报
回复
学习~~~
philipsslg 2004-12-28
  • 打赏
  • 举报
回复
能不能给个函数输入时间得到是第几周???
icedut 2004-12-28
  • 打赏
  • 举报
回复
学习学习
正好要用到
philipsslg 2004-12-28
  • 打赏
  • 举报
回复
系统把2004-12-31算53周,把2005-1-1当做第1周,其实这两周是同一周,怎么把它统计为一周,
group by 进去。
philipsslg 2004-12-28
  • 打赏
  • 举报
回复
set datfirst 1
DATEPART(WEEK, [Date]) as Week
如果不考虑跨年可以这样统计,就是卡在跨年那里,能不能具体说说跨年怎么处理??
yingqing 2004-12-28
  • 打赏
  • 举报
回复
playyuer(退休干部 卧鼠藏虫) ,向你學習
bei_zj 2004-12-28
  • 打赏
  • 举报
回复
playyuer(退休干部 卧鼠藏虫) ,向你学习一下!
philipsslg 2004-12-28
  • 打赏
  • 举报
回复
我是做本周与前9周的曲线图,如果本周是本年度的20几周,那很好统计,如果本周是第二周,那岁末年初那个比较难统计。
icedut 2004-12-28
  • 打赏
  • 举报
回复
datepart在岁末年初的时候得到了2个周数是吧
感觉真复杂啊

你是要1-10周,安周统计数据吧

你看这样是否太笨了:把1-10周,每周的开始日期,结束日期,及对应的周数,放到一个表里,这样可以统计么.例如2004-12-27---2005-1-02 是2005年的第一周的开始日期与结束日期




philipsslg 2004-12-28
  • 打赏
  • 举报
回复
datepart不能算,岁末年初的。
playyuer 2004-12-27
  • 打赏
  • 举报
回复
T-SQL: 三个通用的与日期相关的,辅助按周(星期日是周的最后一天)汇总的自定义函数
http://blog.csdn.net/playyuer/archive/2004/11/04/167172.aspx

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧