我在DELPHI 里面发现一个不能解释的错误,在用ADOQuery+TDateTimePicker进行查询的时候,如:
var
 s:string;
begin
  s:='select * from Table1  where (day,登陆日期,:sDate)  order by Code'
  ADOQuery1.close;
  ADOQuery1.sql.clear;
  ADOQuery1.sql.add(s);
  ADOQuery1.paramters.paramterByname('sDate').value:=TDateTimePicker1.DateTime;
  ADOQuery1.Open;
end;和下面的写法
var
 s:string;
begin
  s:='select * from Table1  where (day,登陆日期,:sDate)  '
  ADOQuery1.close;
  ADOQuery1.sql.clear;
  ADOQuery1.sql.add(s);
  ADOQuery1.paramters.paramterByname('sDate').value:=TDateTimePicker1.DateTime;
  ADOQuery1.Open;
end;
这两种写法,执行的结果不一样,有order by 的结果正常,而没有order by 的则出现的结果差两天(例如查询TDateTimePicker1.Date='2004-10-27',而出现的结果是'2004-10-29'),为什么啊,请各位自己在DELPHI 里面试试,(上面的写法可能有少许错误),是不是在DELPHI 里面写SQL 语句的时候,DATEDIFF 和 ORDER BY 之间有某种关联呢?

解决方案 »

  1.   

    where (day,登陆日期,:sDate)?什么意思??
    where datediff(d,登陆日期,:sDate) > 10 //大于10天
      

  2.   

    写错了哦,应该是
    s:='select * from Table1  where (day,登陆日期,:sDate)=0  order by Code'
    s:='select * from Table1  where (day,登陆日期,:sDate)=‘
      

  3.   

    ADOQuery1.paramters.paramterByname('sDate').value:=TDateTimePicker1.DateTime; 这一句在程序里面也可以通的过?
    针对你的问题是order by 只是对满足条件的记录排序 datediff只是取的日期相差的天数  没有多少关联,把你的问题说的明白点,
      

  4.   

    大家可以试一试啊。只要是用DateTimePicker查询就可以发现问题:
      s:='select * from 挂号号表 where datediff(day,号表日期,:sDate)=0';
      AdsGhhb.Close;
      AdsGhhb.SQL.Clear;
      AdsGhhb.SQL.Add(s);
      AdsGhhb.Parameters.ParamByName('sDate').Value:=DateTimePicker1.DateTime;
      AdsGhhb.Open;

      s:='select * from 挂号号表 where datediff(day,号表日期,'''
         +FormatDateTime('yyyy-mm-dd',DateTimePicker2.DateTime)+''')=0';
      AdsGhhb.Close;
      AdsGhhb.SQL.Clear;
      AdsGhhb.SQL.Add(s);
      AdsGhhb.Open;
    这两种方法执行的结果不一样啊!为什么!!!!
      

  5.   

    当然不一致了,第一种情况是日期加时间,而第二种则单单是日期,曾经对这样的问题感觉到过迷茫
    结果仔细一看,DATETIMEPICKER的DATETIME属性是指日期和时间,日期你可以选择,但时间没你创建时默认的时间,而FORMATDATETIME之后就只有再日期了,而它返回的是一个字符串。
      

  6.   

    呵呵,悄悄的告诉你吧,0在SQL里面代表1900/1/1,而1900/1/1在Delphi里面的数值是2,这样你明白了吧?你拿Delphi里的2代表的是1900/1/1,拿到SQL就变1900/1/3了,当然不合适了。正确做法是用日期字串来查询,要不你就人为的自己加减2。
      

  7.   

    谢谢楼上的,只是不明白为什么是这样的呢?在SQL里面查询用参数比较好啊,至少不会写错语句,用日起字符窜会出现一个问题,就是在98下面当日起的格式是yy-m-d的情况就会麻烦啊!