我现在做一个仓库的每月报表,就是要统计某个时间段里的出入明细帐那些属于入库?总量有多少?
SQL语句余下:
update yuejie set yuejie.zcrk11=cryd.fx from yuejie,(select liaohao,banbenhao,sum( churushuliang)as fx from cryd where datediff(m, churushijian,getdate())<=1 and churuleixing in ('验收入库','制令入库')group by liaohao,banbenhao) as cryd where yuejie.liaohao=cryd.liaohao and yuejie.banbenhao=cryd.banbenhao
    现在问题在这,当我11月25日23点整执行上面这条语句,理论上应该只选取从10月25日23点整~11月25日23点整参与计算,但实际上2008-10-21 18:34:00 的出入明细也参与计算了,我查了日历10月有31日,11月只有30日,我怀疑我的时间函数是否有问题,datediff(m, churushijian,getdate())<=1  (churushijian是我的出入明细帐的时间字段)    还有一个问题,当我把上面的那条SQL语句里的时间函数改为:datediff(d, churushijian,getdate())<=30的时候,并执行,select liaohao,banbenhao,sum( churushuliang)as fx from cryd where datediff(m, churushijian,getdate())<=1 and churuleixing in ('验收入库','制令入库')group by liaohao,banbenhao
结果2008-10-21 18:34:00 的出入明细没有参与计算了;
但我执行整条SQL语句: update yuejie set yuejie.zcrk11=cryd.fx from yuejie,(select liaohao,banbenhao,sum( churushuliang)as fx from cryd where [color=#99CC00]datediff(d, churushijian,getdate())<=30 and churuleixing in ('验收入库','制令入库')group by liaohao,banbenhao[/color]) as cryd where yuejie.liaohao=cryd.liaohao and yuejie.banbenhao=cryd.banbenhao 
还是把2008-10-21 18:34:00 的出入明细参与计算了,我不知道是什么原因,感觉都不按常规出牌,怪怪的!!!
请高手帮我分析一下?我的数据库是SQL SERVER 2000

解决方案 »

  1.   

    如果用datediff() 中间的 churushijian 必须带毫秒 1991-10-21 00:00:00.000 
    你改下格式看看 
      

  2.   

    现在问题在这,当我11月25日23点整执行上面这条语句,理论上应该只选取从10月25日23点整~11月25日23点整参与计算,但实际上2008-10-21 18:34:00 的出入明细也参与计算了--------------
    where datediff(m, churushijian,getdate()) <=1
    ---->改成下面的试试 
    where churushijian between dateadd(m, -1, getdate()) and getdate()
      

  3.   

    where datediff(m, churushijian, '2008-11-25 23:00:00') <=1 --2008-10-1之后的数据都会参与计算
    ---->改成下面的试试 
    where churushijian between '2008-10-25 23:00:00' and '2008-11-25 23:00:00' --10.25 到11.25之间的数据会参与计算
      

  4.   

    把where datediff(m, churushijian,getdate()) <=1
    ---->改成下面的试试 
    where churushijian between dateadd(m, -1, getdate()) and getdate() 确实是正确的
    但你能说明where datediff(m, churushijian,getdate()) <=1跟where churushijian between dateadd(m, -1, getdate()) and getdate()有什么实质区别吗?
      

  5.   

    还请求各位对于我的第二个问题分析一下。     当我把上面的那条SQL语句里的时间函数改为:datediff(d, churushijian,getdate()) <=30的时候,并行,
    select liaohao,banbenhao,sum( churushuliang)as fx from cryd where datediff(m, churushijian,getdate()) <=1 and churuleixing in ('验收入库','制令入库')group by liaohao,banbenhao 
    结果2008-10-21 18:34:00 的出入明细没有参与计算了; 
    但我执行整条SQL语句: update yuejie set yuejie.zcrk11=cryd.fx from yuejie,(select liaohao,banbenhao,sum( churushuliang)as fx from cryd where datediff(d, churushijian,getdate()) <=30 and churuleixing in ('验收入库','制令入库')group by liaohao,banbenhao) as cryd where yuejie.liaohao=cryd.liaohao and yuejie.banbenhao=cryd.banbenhao 
    还是把2008-10-21 18:34:00 的出入明细参与计算了,我不知道是什么原因,感觉都不按常规出牌,怪怪的!!! 
    请高手帮我分析一下?我的数据库是SQL SERVER 2000
      

  6.   

    DateDiff 函数
    如果最前面的参数用m,那么就是只按照月份做比较,如果当前是11月,那么你的语句就会把10月、11月以及11以后的所有数据都满足条件。
    如果最前面的参数用d,那么就是按照天做比较,如果当前是2008-11-26,那么你的语句就会把2008-10-27号及以后的所有数据都满足条件。
      

  7.   


     还有一个问题,当我把上面的那条SQL语句里的时间函数改为:datediff(d, churushijian,getdate()) <=30的时候,并执行,select liaohao,banbenhao,sum( churushuliang)as fx from cryd where datediff(m, churushijian,getdate()) <=1 and churuleixing in ('验收入库','制令入库')group by liaohao,banbenhao 
    结果2008-10-21 18:34:00 的出入明细没有参与计算了; ------------------
    按照修改后的执行(红色的),2008-10-21的出入明细不会参与计算,因为2008-10-21与2008-11-25相差35天。
    (同样,2008-10-18的出入明细也不会参与计算)
      

  8.   

    但我执行整条SQL语句: update yuejie set yuejie.zcrk11=cryd.fx from yuejie,(select liaohao,banbenhao,sum( churushuliang)as fx from cryd where datediff(d, churushijian,getdate()) <=30 and churuleixing in ('验收入库','制令入库')group by liaohao,banbenhao) as cryd where yuejie.liaohao=cryd.liaohao and yuejie.banbenhao=cryd.banbenhao 
    还是把2008-10-21 18:34:00 的出入明细参与计算了,我不知道是什么原因,感觉都不按常规出牌,怪怪的!!! --------------
    如果执行的时候,服务器时间是2008-11-25,则2008-10-21肯定不会参与计算。