有一个需求表XSales
字段
ID          编号
wlh         物料号
feipei      分配给某位采购名
feipeitime  分配时间ID     wlh     feipei    feipeitime
1      adb       ken     2009-11-19 11:50:42
2      342       tom     2009-11-19 15:50:42我的意思是一条需求在分配五个小时后采购员的名字变成all,要控制在工作的八个小时内(9:00到18:00)
比如上面的第一条需求当当前时间到了2009-11-19 16:50:42后KEN就变成all
 sql="update XSales set feipei='all' where  feipeitime<=DateAdd(hour,-5,getdate())",这条语句可以实现上面的,
但是第2条需求在晚上20点后就变成了all,我想实现的是到第二天的工作时间第2条需求还有三个小时,从上午9点开始算起,第2条需求应该在第二天的11:50后才变成all,
就是要去掉晚上的时间(18:00-9:00)才来统计。
恳请大家帮忙了

解决方案 »

  1.   

     用case when 来判断
      

  2.   

    http://topic.csdn.net/u/20091105/17/a870f6d0-d661-45ae-8d67-d70c5f8702fa.html?85037看看这个帖子 其实就是很多的case when 的嵌套
      

  3.   

    select (case TitleOfCourtesy when 'Ms.' then '女士' when 'Mr.' then '男士' else '' end) as TitleOfCourtesy from dbo.Employees
    根据这个例子可以写出滴
      

  4.   


    if OBJECT_ID('tb') is not null drop table tb
    if OBJECT_ID('tb1') is not null drop table tb1GO CREATE TABLE tb(
     ID INT, 
     wlh varchar(10) ,
     feipei varchar(10),
     feipeitime datetime,
     EndDateTime datetime 
     )
    GO
    alter function getEndTime(@StartTime DateTime)
    returns DateTime
    as
    begin
    Declare @Diff int
    if datediff(SECOND,dateadd(Hour,5,@StartTime),cast((Convert(varchar(10),@StartTime,120)+' 18:00:00') as datetime))<0
    begin
    Set @Diff=datediff(MINUTE,@StartTime,cast((Convert(varchar(10),@StartTime,120)+' 18:00:00') as datetime))
    SET @StartTime=dateadd(Day,1,@StartTime);
    SET @StartTime=dateadd(MINUTE,@Diff,cast((Convert(varchar(10),@StartTime,120)+' 9:00:00')as datetime))
    end
    else
    begin
    set @StartTime= dateadd(Hour,5,@StartTime)
    end

    return @StartTime
    end GOinsert into tb(ID,wlh,feipei,feipeitime,EndDateTime)values(
    1,'adb','ken','2009-11-19 11:50:42',dbo.getEndTime('2009-11-19 11:50:42'))insert into tb(ID,wlh,feipei,feipeitime,EndDateTime)values(
    2,'342','tom','2009-11-18 15:50:42',dbo.getEndTime('2009-11-18 15:50:42'))GOselect 
    a.ID,
    a.wlh,
    case when DATEDIFF(MINUTE,a.EndDateTime,cast(GETDATE()as datetime))>=0 then 'ALL' else a.feipei end as feipei,
    feipeitime,
    a.EndDateTime
    from tb aID          wlh        feipei     feipeitime              EndDateTime
    ----------- ---------- ---------- ----------------------- -----------------------
    1           adb        ken        2009-11-19 11:50:42.000 2009-11-19 16:50:42.000
    2           342        ALL        2009-11-18 15:50:42.000 2009-11-19 11:10:00.000(2 行受影响)
    这样可以不?在新增的时候就算出什么时候要变成ALL,以后查询的时候判断当前时间是否超过 EndDateTime
    如果超过就显示"ALL"否则 就显示原来的。。新手,保留个人看法 
      

  5.   

    谢谢回答 看了那贴子石头的回复  有点没看懂
    我用这个语句可以控制下午3点到4点加19个小时 update XSales set feipei='all' where  getdate()>=DateAdd(hour,19,feipeitime) and datepart(hh,feipeitime) between 15 and 16 
    下午4点到5点 就加20  下午5点到6点就加21个小时 上午9点到下午3点的 就加5个小时 但要写四个这样的语句很麻烦执行速度肯定也慢,  请问用case when 怎么写呢 case when  可以接在where语句后面吗
      

  6.   

    请问用case when 怎么写呢 case when  可以接在where语句后面吗--
    可以 
      

  7.   

    大哥请问怎么接呢 
        set rs=server.createobject("adodb.recordset")
    sql="update XSales set feipei='all' where feipeitime<=DateAdd(hour,-19,getdate()) and datepart(hh,feipeitime) between 15 and 19"
    rs.open sql,conn,1,3
    rs.Close
    set rs=nothing

     set rs=server.createobject("adodb.recordset")
    sql="update XSales set feipei='all' where  feipeitime<=DateAdd(hour,-5,getdate())"
    rs.open sql,conn,1,3
    rs.Close
    set rs=nothing怎么用 case when 语句 把上面的合并成一条语句呢  题目还是上面的题目 谢谢