现在数据库结构如下ID     AddTime                  EndTime
===================================================
1      2009-06-01 09:00:00      2009-06-14 09:00:00
2      2009-06-02 09:00:00      2009-06-14 09:00:00
3      2009-06-03 09:00:00      2009-06-14 09:00:00
4      2009-06-04 09:00:00      2009-06-14 09:00:00
5      2009-06-05 09:00:00      2009-06-14 09:00:00
6      2009-06-06 09:00:00      2009-06-14 09:00:00
7      2009-06-07 09:00:00      2009-06-14 09:00:00我想查询字段“EndTime”大于字段“AddTime”加上10天的信息,如何做。还有,可不可以对字段“AddTime”进行一段代码操作后进行查询。
比如说,我做了个封装处理函数,函数是处理一个时间(比如2009-01-01 12:00:00)5天后,其中对双休日、节假日、节假调休日日期进行了追加,这样一个函数。然后我想对数据库字段“AddTime”进行这样一个函数处理后,再和字段“EndTime”进行比较。不知道说的明不明确,嘴笨没办法。
希望大家能够提供好的建议。

解决方案 »

  1.   

    update yourTable 
    set EndTime=DATE_ADD(AddTime,INTERVAL 10 DAY)
    where EndTime>AddTime;不知道这是不是你要的。如果你直接根据你提供的测试数据给出正确的输出结果,这样容易避免误解。
      

  2.   

    我想查询字段“EndTime”大于字段“AddTime”加上10天的信息这个应该是这样:
    select * from yourTable
    where EndTime>DATE_ADD(AddTime,INTERVAL 10 DAY)
      

  3.   

     SELECT * from table where DATEDIFF('EndTime','AddTime')>=10;
      

  4.   

    我想查询字段“EndTime”大于字段“AddTime”加上10天的信息,如何做。
    select * from tt where EndTime>DATE_ADD(AddTime,INTERVAL 10 DAY)
    or
    select * from tt where EndTime>(AddTime+INTERVAL 10 DAY)
      

  5.   

    还有,可不可以对字段“AddTime”进行一段代码操作后进行查询。 
    比如说,我做了个封装处理函数,函数是处理一个时间(比如2009-01-01 12:00:00)5天后,其中对双休日、节假日、节假调休日日期进行了追加,这样一个函数。然后我想对数据库字段“AddTime”进行这样一个函数处理后,再和字段“EndTime”进行比较。应该可以,举例说明
      

  6.   


    首先,谢谢各位的指点,第一个问题已经得到解决,看来SQL方面本人还要再加强点学习。ID    AddTime                  EndTime 
    =================================================== 
    1      2009-06-01 09:00:00      2009-06-14 09:00:00 
    2      2009-06-02 09:00:00      2009-06-14 09:00:00 
    3      2009-06-03 09:00:00      2009-06-14 09:00:00日期表:
    日  期:6.1  6.2  6.3  6.4  6.5  6.6  6.7  6.8  6.9  6.10  6.11  6.12  6.13  6.14  6.15  6.16
    星  期:一   二   三   四   五   六  日   一   二   三   四   五    六   日   一   二
    节假日:                                      清明节第二个问题是这样的,我说的详细点。
    比如说,字段“AddTime”的时间是“2009-06-01 09:00:00”,10天后按正常来算的话应该是“2009-06-11 09:00:00”,但在这10天内是有双休日的,比如6月1号是星期一,那么到6月6号是星期六,不计算到10天之内,6月7号是星期天当然也不计算在内,那么得到的日期应该是“2009-06-13 09:00:00”,可是按照星期的周期来算的话,6月13号是星期六,也就不算在内了,最后的结果日期是“2009-06-15 09:00:00”。其实就是按照正常工作日算的日期,踢出双休日而已。这只是一种情况,还有一种比较麻烦,所以我把这些日期规则做成了一个封装的函数。举一下例子吧:刚才上面说的是双休日,我打个比方,在上面的日期表中已经列出,6月11号是“清明节”,那么6月11日和12日是要放假的咯,比方说6月14日要补一天班,那么就属于正常工作日了,现在字段“AddTime”开始时间是“2009-06-01 09:00:00”,10天后按照上面说的最后日期应该是“2009-06-15 09:00:00”,但其中6月11日和12日是节日放假,所以属于节假日,不算做正常工作日,所以要踢出,而6月14日呢,虽然是星期天,但是补节假日的班,所以属于正常工作日,所以最后的日期应该是“2009-06-16 09:00:00”了。累死了,应该够详细了,我把这一部分日期规则封装成了一个类,所以想在数据库查询的时候,对字段“AddTime”进行一个类的操作后,得到一个日期结果,再和字段“EndTime”进行比较。
      

  7.   

    就是说你在程序中生成新的EndTime,再与表中的EndTime比较?
    如果是,应该可以。新的EndTime是存入在表中,还是临时计算?
      

  8.   

    就是将“AddTime”字段进行临时的处理,然后和“EndTime”进行比较。
    不过在认为最为简单有效的方法基础上可以采用其他方式。
      

  9.   

    你需要一个日期表,内容:日期(RQ)、BZ(是否是节假日 OR 特殊日期,为1,否则为NULL) 
    SELECT MAX(RQ) FROM (
    select *
     from ldbrq where nweek-6<0 and rq<='2009-06-01' +interval 10 day AND BZ IS NULL 
    UNION
    select *
     from ldbrq where nweek-6<0 and rq>'2009-06-01' AND BZ IS NULL
    LIMIT 10) A1
      

  10.   

    生成ldbrq 的SP:
    DELIMITER $$DROP PROCEDURE IF EXISTS `zz`.`rqpd`$$CREATE DEFINER=`root`@`localhost` PROCEDURE `rqpd`()
    BEGIN
    declare qq date;
    set qq='2009-6-1';
    while  qq<='2009-6-30' do
    insert into test.ldbrq values (qq,WEEKday(qq)+1);
    set qq=qq+interval 1 day;
    end while;
        END$$DELIMITER ;
    sq:
    SELECT MAX(RQ) as newendtime FROM (
    select *
     from ldbrq where nweek-6<0 and rq<='2009-06-02' +interval 10 day AND BZ IS NULL AND RQ>='2009-06-02'
    UNION
    select *
     from ldbrq where nweek-6<0 and rq>'2009-06-02' AND BZ IS NULL LIMIT 10) A1测试时,用了具体日期,你可以将'2009-06-02'->AddTime
      

  11.   

    完整代码 :
    select *,tmaxsj(addtime) from tsj;DELIMITER $$
    drop function if exists tmaxsj$$
    CREATE    FUNCTION `zz`.`tmaxsj`(dd datetime)
        RETURNS datetime
           BEGINSELECT MAX(RQ) into @newendtime FROM ( 
    select * 
    from `test`.ldbrq where nweek-6 <0 and rq <=dd +interval 10 day AND BZ IS NULL AND RQ>=dd 
    UNION 
    select * 
    from `test`.ldbrq where nweek-6 <0 and rq>dd  AND BZ IS NULL LIMIT 10) A1;
    return @newendtime;
        END$$DELIMITER ;
      

  12.   

    你的日期是DATETIME型,ldbrq表中的记录是DATE型,略加修改:select *,tmaxsj(addtime) from tsj;DELIMITER $$DROP FUNCTION IF EXISTS `zz`.`tmaxsj`$$CREATE DEFINER=`root`@`localhost` FUNCTION `tmaxsj`(dd1 datetime) RETURNS datetime
    BEGIN
    declare dd date;
    set dd=date(dd1);
    SELECT MAX(RQ) into @newendtime FROM ( 
    select * 
    from `test`.ldbrq where nweek-6<0 and rq between dd and dd +interval 10 day AND BZ IS NULL  
    UNION 
    select * 
    from `test`.ldbrq where nweek-6<0 and rq>dd  AND BZ IS NULL LIMIT 10) A1;
    return cast(concat(@newendtime,' ',time(dd1)) as datetime);
        END$$DELIMITER ;
      

  13.   

    首先,先谢谢各位的指导,由于最近工作比较忙,没来得及结贴,望多多包涵,也谢谢“WWWWA”和“WWWWB”的跟踪解释。