周报,新年之后出问题! 急急~~~~~~~~~~~~~~~~

meilian01 2005-01-10 09:41:51
ALTER proc proc_sqe_WeekInspLot
@inDate datetime, @whereStr nvarchar(3000)
as
set language us_english
declare @s varchar(8000),@i int

select @s='',@i=0
set language english
while @i > -4
select @s=',[WW'+datename(week,dateadd(week,@i,@inDate))
+']=count(case datename(week,SampleDates) when '''
+datename(week,dateadd(week,@i,@inDate))
+''' then LotNo end)'+@s
,@i=@i-1

exec('select ''Insp.Lot Qty'' as Date ' + @s + ' from vw_sqe_HeaderQty
where datediff(week,SampleDates,'''+ @inDate+''') between 0 and 3 '+ @whereStr +'
group by year(SampleDates)')
set language 简体中文



以上是我的存储过程,每次生成四周(当周,前三周)的数据。
在2004年的时候没问题,2005年就出错了。

2004年12月8号数据:

Date WW47 WW48 WW49 WW50
Insp.Lot Qty 1917 1710 1636 226


2005年1月8 号数据:

Date WW51 WW52 WW1 WW2
Insp.Lot Qty 1762 929 0 0
Insp.Lot Qty 0 0 70 1765



问题是,2004年与2005 年数据成了两条,我想得到的数据应是:

2005年1月8 号数据:

Date WW51 WW52 WW1 WW2
Insp.Lot Qty 1762 929 70 1765



我想问题是在2005年1月1日,存储过程里把2004年12月26日至31日的数据作为2004年52周的数据。
但2005年1月1日的数据就当成2005年的第1周数据了,所以成了两条数据。请问各位有没解决办法?

请大家帮我看看。谢谢!!
...全文
433 39 打赏 收藏 转发到动态 举报
写回复
用AI写文章
39 条回复
切换为时间正序
请发表友善的回复…
发表回复
prcgolf 2005-01-13
  • 打赏
  • 举报
回复
up
meilian01 2005-01-10
  • 打赏
  • 举报
回复
谢谢大家
我再看看
lsxaa 2005-01-10
  • 打赏
  • 举报
回复
如果不知道那几天是一周的,在查询的时候加上一列就行了

select *,datepart(wk,日期) from 表
子陌红尘 2005-01-10
  • 打赏
  • 举报
回复
to:meilian01(meilian)

楼主对2004年的周数理解有误,试试楼下两个查询:

select datepart(wk,cast('2004-12-25' as datetime))
select datepart(wk,cast('2004-12-26' as datetime))

2004-12-26 至 2004-12-31 是2004年的第53周,因为2005-01-01是星期六,从一个自然周的角度而言,应该与2004年的第53周归属同一个自然周。

因此,我的判断是:53周的数据应是2004年第53周的数据 + 2005年第1周(即1月1日)的数据



lsxaa 2005-01-10
  • 打赏
  • 举报
回复
实在不行,还按你原来的语句,得出结果后,再group by 一次就成了,呵呵 嗖主意
prcgolf 2005-01-10
  • 打赏
  • 举报
回复
up
lsxaa 2005-01-10
  • 打赏
  • 举报
回复
唉,不知道了
meilian01 2005-01-10
  • 打赏
  • 举报
回复
to: yunshiyu(陨石雨)
那第52周的数据呢?

在我认为,53周的数据应是2004年第52周的数据 + 2005年第1周(即1月1日)的数据
这样也是不对。

lsxaa(小李铅笔刀)
还是一样的。:(
lsxaa 2005-01-10
  • 打赏
  • 举报
回复
把你语句里的datename 改成datepart 试试
lsxaa 2005-01-10
  • 打赏
  • 举报
回复
把datename 改成datepart 试试
meilian01 2005-01-10
  • 打赏
  • 举报
回复
我现在真不知道那个53周的数据到底是那几天的数据。

我快晕死了。

yunshiyu 2005-01-10
  • 打赏
  • 举报
回复
当输入1月10日的时候,2004年是有53周,从26号到31号 数据也应该是1731
当输入1月8日的时候,和1月10日不在同一周,查到的结果就是2005年的第一周,只有1月1日! 数据也应该是140,
WW53-》1731 是 2004年26号到31号的数据
WW1-》140 是 2005年1月1日的数据
lsxaa 2005-01-10
  • 打赏
  • 举报
回复
哦 那应该是函数的问题了
meilian01 2005-01-10
  • 打赏
  • 举报
回复
to:lsxaa(小李铅笔刀)

我都是按周日是一个星期的第一天

lsxaa 2005-01-10
  • 打赏
  • 举报
回复
应该是每周的第一天不同,造成的

你设置一下 @@datefirst 的值,和函数中的@@datefirst值保持一致
meilian01 2005-01-10
  • 打赏
  • 举报
回复
:D 上面错了

但现在出现另一个问题,我输入的日期是2005年1月8日,数据如下:

Date WW51 WW52 WW1 WW2
Insp.Qty(pcs) 3530 1853 140 3529

如果输入的是2005年1月10日,数据如下: -----输入的是1月10日
Date WW52 WW53 WW2 WW3
Insp.Qty(pcs) 1853 1731 3529 509

怎么会出现第53周(2004)年,而且数据很奇怪,并不是第1周(2005)的数据。

meilian01 2005-01-10
  • 打赏
  • 举报
回复
上面问题已解决
我只是将 group by year(SampleDates) 去掉。

但现在出现另一个问题,我输入的日期是2005年1月8日,数据如下:

Date WW51 WW52 WW1 WW2
Insp.Qty(pcs) 3530 1853 140 3529

如果输入的是2005年1月8日,数据如下:
Date WW52 WW53 WW2 WW3
Insp.Qty(pcs) 1853 1731 3529 509

怎么会出现第53周(2004)年,而且数据很奇怪,并不是第1周(2005)的数据。
lsxaa 2005-01-10
  • 打赏
  • 举报
回复
http://community.csdn.net/Expert/topic/3680/3680686.xml?temp=.1348078
NinGoo 2005-01-10
  • 打赏
  • 举报
回复
关注
pbsql 2005-01-10
  • 打赏
  • 举报
回复
再改一下试试:
declare @yyyy int
set @i=0
set @yyyy=year(@inDate)
while @i>-4
select @s=',[WW'+datename(week,@inDate)
+']=count(case datename(week,SampleDates) when '''
+datename(week,@inDate)
+''' then LotNo end)'+@s
,@inDate=case when datename(week,cast(@yyyy as varchar)+'-1-1')
=datename(week,@inDate)
then cast(@yyyy-1 as varchar)+'-12-31'
when datediff(day,cast(@yyyy as varchar)+'-1-1',@inDate)<7
then cast(@yyyy as varchar)+'-1-1'
else @inDate-7 end
,@i=@i-1
加载更多回复(19)

34,587

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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