s1:='select * from 人员表 where (( (datepart(mm,出生日期)=:aa)and(datepart(dd,出生日期)>=:bb)) or(datepart(mm,出生日期)>:aa) ) and (( (datepart(mm,出生日期)=:cc)and(datepart(dd,出生日期)<=:dd)) or(datepart(mm,出生日期)<:cc) )';   adoquery1.Close;
   adoquery1.SQL.Clear;
   adoquery1.SQL.Add(s1);
   adoquery1.Parameters.ParamByName('aa').Value :=a1;
   adoquery1.Parameters.ParamByName('bb').Value :=a2;
   adoquery1.Parameters.ParamByName('cc').Value :=a3;
   adoquery1.Parameters.ParamByName('dd').Value :=a4;   adoquery1.Open ; 以上是本人写的程序,要求是查找符合a1月a2日到a3月a4日之间的生日的人员。
编辑无错,但是显示出来的却只有A1当月A2日以后的生日。大于A1月的却查不到。
 好象OR以后的语句没有起到作用。
希望各位大哥帮帮忙啦,俺在这里先谢谢了。

解决方案 »

  1.   

    先在查询分析器里面调试一下sql语句
      

  2.   

    而且只有A1和a3相等的时候,才可以查到,A3>a1,就什么也查不到。
      

  3.   

    s1:='select * from 人员表 where (DATEPART(mm, 出生日期) * 100 + DATEPART(dd, 出生日期) >= :aa * 100 + :bb) AND (DATEPART(mm, 出生日期) * 100 + DATEPART(dd, 出生日期) <= :cc * 100 + :dd)';   adoquery1.Close;
       adoquery1.SQL.Clear;
       adoquery1.SQL.Add(s1);
       adoquery1.Parameters.ParamByName('aa').Value :=a1;
       adoquery1.Parameters.ParamByName('bb').Value :=a2;
       adoquery1.Parameters.ParamByName('cc').Value :=a3;
       adoquery1.Parameters.ParamByName('dd').Value :=a4;   adoquery1.Open ;
      

  4.   

    我把A1,A2,A3,A4换成数据在查询分析器里试了,没有错。
      

  5.   

    谢谢JADELUO啦,问题解决了。
    老兄能不能告诉一下,为什么要那样写呢?
      

  6.   

    按照你原来的思路, 应该这样写:
    SELECT *
    FROM 人员表
    WHERE (DATEPART(mm, 出生日期) >= :aa) AND (DATEPART(dd, 出生日期) >= :bb) AND 
          (DATEPART(mm, 出生日期) <= :cc) AND (DATEPART(dd, 出生日期) <= :dd)
      

  7.   

    我觉得你这样写不对,如果月大于AA,但是日期小于BB,你写的就查不到。
      

  8.   

    “我觉得你这样写不对,如果月大于AA,但是日期小于BB,你写的就查不到。”如果月大于AA,但是日期小于BB,那么这个日期就不符合“查找符合a1月a2日到a3月a4日之间的生日的人员”,是不应该在查找结果集中出现了。