很长时间没有写数据库软件了,现在有个用时间查询的问题解决不了,请教各位,望多多指教!!! 先谢谢了
情况如下:
 数据引擎采用,BDE  利用Delphi7自带的数据库
 数据表:  Date    A      10
          Name    A      16
          Amount  N
 实现目标:  想查询一段时间内时间内的物品数量
             用DateTimePicker1 ,DateTimePicker2表示时间范围
实现代码如下:
  Query1.close;
  Query1.SQL.Clear;
  Query1.SQL.Add('select * from DATA.db where date>=:a1');
  Query1.sql.add(' and date <=:a2 ');
  Query1.Params.ParamValues['a1']:=formatdatetime('yyyy-mm-dd',datetimepicker1.date);
  Query1.params.ParamValues['a2']:=formatdatetime('yyyy-mm-dd',datetimepicker2.date);
  Query1.SQL.add(' and Name like '''+edit1.Text+'%''');
  Query1.sql.add(' order by date');
  Query1.Open;但是该段代码执行到open时,会报"Invalid use of keyword. 
                              Token:date>=?
                              Line Number:1.
的错误,请问如何解决???   

解决方案 »

  1.   

    Query1.Params.ParamValues['a1']:=floattostr(datetimetofloat(datetimepicker1.date));
      Query1.params.ParamValues['a2']:=floattostr(datetimetofloat(datetimepicker2.date));
    将datetime参数转化为double参数.这样就不错了
    另外改写sql语句也可以,将参数转化为时间型.access数据库用CDate,sqlserver用cast函数
    Query1.SQL.Add('select * from DATA.db where date>=CDate(:a1)  and date <=CDate(:a2) ');
      

  2.   

    实际上在大多数编程语言中date实际数据就是一个double.所以可以转换成数值型比较
    但楼主代码里,sql语句参数用值替换后,与date比较的不是数值,也不时时间,也不是字串.只能导致语法错误.
      

  3.   

    Query1.close;
      Query1.SQL.Clear;
      Query1.SQL.Add('select * from DATA.db where date>='':a1''');  //加引号试试
      Query1.sql.add(' and date <='':a2'' ');                       //
      Query1.Params.ParamValues['a1']:=formatdatetime('yyyy-mm-dd',datetimepicker1.date);
      Query1.params.ParamValues['a2']:=formatdatetime('yyyy-mm-dd',datetimepicker2.date);
      Query1.SQL.add(' and Name like '''+edit1.Text+'%''');
      Query1.sql.add(' order by date');
      Query1.Open;
      

  4.   

    你的字段名不起“Date”这样的敏感词。
      

  5.   

    上面的高手都说对了,Date是关键字,应当尽量避免用作字段名,表名,如果用了也没关系,
    标准SQL中,可以用方括号把字段名和表名括起来避免关键字冲突和多语言问题,如 [date]<=':a2',这个应当养成习惯,写SQL时,尽量都用方括号引用字段名、表名等。