var Date1,Date2:TDate; begin Date1:=StrToDate(combobox1.text+'-'+combobox2.text+'-1'); Date2:=StrToDate(combobox1.text+'-'+combobox2.text+'-1'); ... adoquery1.SQL.Add('select count(*) from 表 where 日期字段between :tt1 and :tt2'); AdoQuery1.Params[0]:=Date1; AdoQuery2.Params[1]:=Date2; ...你的两个日期是一样的啊,直接用 日期字段=:tt1 就好了
这个我知道,我只是想知道那句SQL语句哪里有问题,或者说如何去判断两个日期之间!
应该这样 select * from mytable where mydate between #2002-01-01# and #2002-12-30# 注意#
var Date1,Date2:TDate; Date1:=StrToDate(combobox1.text+'-'+combobox2.text+'-1'); Date2:=StrToDate(combobox3.text+'-'+combobox4.text+'-1'); adoquery1.Close; adoquery1.sql.Clear; adoquery1.SQL.Add('select count(*) from 表 where 电费年月 between #date1# and #date2#'); 还是错,帮帮小弟!
老大,这个应该这样 最后一句 adoquery1.SQL.Add('select count(*) from 表 where 电费年月 between #'+combobox1.text+'-'+combobox2.text+'-1'+'# and #'+combobox3.text+'-'+combobox4.text+'-1'+'#'); date1,date2不要了! 看样子你delphi水平刚入门吧!string类型里面怎么用#date1#怎么行?字符串只能str1+str2这么表示,str1+date类型都不匹配.
adoquery1.SQL.Add('select count(*) from 表 where 日期字段 between :tt1 and :tt2'); AdoQuery1.Params[0]:=Date1; AdoQuery2.Params[1]:=Date2;象这样用参数啊
adoquery1.SQL.Add('select count(*) from 表 where 日期字段between '''+combobox2.text+'-1-'+combobox1.text+''' and '''+combobox2.text+'-1-'+combobox1.text+'''');combobox的值是选择年和月, 請注意:格式一定要是:月-日-年;如果還不行,那就是日期連接符不對, 你可以參看一下(控制面板里有),有的是'/'之類的
还有一个,最好trim(combobox1.text)一下!否则有可能出错.你最好先tmpstr:='select count(*) from 表 where 电费年月 between #'+combobox1.text+'-'+combobox2.text+'-1'+'# and #'+combobox3.text+'-'+combobox4.text+'-1'+'#'; 然后adoquery1.SQL.Add(tmpstr);可以用一个edit1.text:=tmpstr; 看看生成的sql语句到底是什么样子!
adoquery1.SQL.Add('select count(*) from 表 where 日期字段 between :tt1 and :tt2'); AdoQuery1.Params[0]:=Date1; AdoQuery2.Params[1]:=Date2;象这样用参数啊字符串的方式也许可以,但不推荐,'2002-8-8'在没有类型转换之前,永远都是字符串,谁也不会把它当成日期。那么你认为一个日期类型的字段和一个字符串比较会有什么结果呢?
那就是你只要在两个月之间查询数据了,你是不用日期的, 那你可以这样的,在ACCESS中有YEAR 和MONTH这两个函数 你可以在写的时候用它处理一下,如 select count(*) from table where year(field) between combobox2.text and combobox1.text and month(filed) between combobox2.text and combobox1.text
其实,最简单的方法是使用异常处理,可以屏蔽各种类型的错误, 然后发现一种就转入一种解决方案, try ... except case x of 1:on ..do 2:on ..do end end 异常的名字也可以在试运行的时候找到, 我通常都是用这种方法,不用老是去想是什么错误, 不过,楼上的那些方法我到是非常佩服,
还想问一下 为什么我加上distinct运行就出错呢?比如adoquery1.SQL.Add('select count(distinct 单位名称) as rs from 表 where 电费年月 between #'+combobox1.text+'-'+combobox2.text+'-1'+'# and #'+combobox1.text+'-'+combobox2.text+'-1'+'#'); 因为有时候单位名称会有重复,我不想要重复的单位!
还想问一下 为什么我加上distinct运行就出错呢?比如adoquery1.SQL.Add('select count(distinct 单位名称) as rs from 表 where 电费年月 between #'+combobox1.text+'-'+combobox2.text+'-1'+'# and #'+combobox3.text+'-'+combobox4.text+'-1'+'#'); 因为有时候单位名称会有重复,我不想要重复的单位!
看样子你日期解决了. 那你后面加上"group by 单位名称"不就可以了吗?这样按照单位group出来.distinct表示要严格唯一.这不是明摆着出错吗!
Date1,Date2:TDate;
begin
Date1:=StrToDate(combobox1.text+'-'+combobox2.text+'-1');
Date2:=StrToDate(combobox1.text+'-'+combobox2.text+'-1');
...
adoquery1.SQL.Add('select count(*) from 表 where 日期字段between :tt1 and :tt2');
AdoQuery1.Params[0]:=Date1;
AdoQuery2.Params[1]:=Date2;
...你的两个日期是一样的啊,直接用 日期字段=:tt1 就好了
select * from mytable where mydate between #2002-01-01# and #2002-12-30#
注意#
我试试看,日期是不一样的!
Date1,Date2:TDate;
Date1:=StrToDate(combobox1.text+'-'+combobox2.text+'-1');
Date2:=StrToDate(combobox3.text+'-'+combobox4.text+'-1');
adoquery1.Close;
adoquery1.sql.Clear;
adoquery1.SQL.Add('select count(*) from 表 where 电费年月 between #date1# and #date2#');
还是错,帮帮小弟!
最后一句
adoquery1.SQL.Add('select count(*) from 表 where 电费年月 between #'+combobox1.text+'-'+combobox2.text+'-1'+'# and #'+combobox3.text+'-'+combobox4.text+'-1'+'#');
date1,date2不要了!
看样子你delphi水平刚入门吧!string类型里面怎么用#date1#怎么行?字符串只能str1+str2这么表示,str1+date类型都不匹配.
AdoQuery1.Params[0]:=Date1;
AdoQuery2.Params[1]:=Date2;象这样用参数啊
請注意:格式一定要是:月-日-年;如果還不行,那就是日期連接符不對,
你可以參看一下(控制面板里有),有的是'/'之類的
然后adoquery1.SQL.Add(tmpstr);可以用一个edit1.text:=tmpstr;
看看生成的sql语句到底是什么样子!
AdoQuery1.Params[0]:=Date1;
AdoQuery2.Params[1]:=Date2;象这样用参数啊字符串的方式也许可以,但不推荐,'2002-8-8'在没有类型转换之前,永远都是字符串,谁也不会把它当成日期。那么你认为一个日期类型的字段和一个字符串比较会有什么结果呢?
那你可以这样的,在ACCESS中有YEAR 和MONTH这两个函数
你可以在写的时候用它处理一下,如
select count(*) from table
where year(field) between combobox2.text and combobox1.text
and month(filed) between combobox2.text and combobox1.text
AdoQuery1.Params[0].AsDate:=Date1;
AdoQuery2.Params[1].AsDate:=Date2;上面.AsDate掉了
#...#
我一般把日期设置为文本,长度10
格式yyyy-mm-dd
比较方便
不然判断太麻烦了
然后发现一种就转入一种解决方案,
try
...
except
case x of
1:on ..do
2:on ..do
end
end
异常的名字也可以在试运行的时候找到,
我通常都是用这种方法,不用老是去想是什么错误,
不过,楼上的那些方法我到是非常佩服,
delphi+access里面
2001-1-1和2001-01-01都一样,不会出错!
njsandman (大师傅) 只是不知道这种情况下日期类型如何表示而已!
为什么我加上distinct运行就出错呢?比如adoquery1.SQL.Add('select count(distinct 单位名称) as rs from 表 where 电费年月 between #'+combobox1.text+'-'+combobox2.text+'-1'+'# and #'+combobox1.text+'-'+combobox2.text+'-1'+'#');
因为有时候单位名称会有重复,我不想要重复的单位!
为什么我加上distinct运行就出错呢?比如adoquery1.SQL.Add('select count(distinct 单位名称) as rs from 表 where 电费年月 between #'+combobox1.text+'-'+combobox2.text+'-1'+'# and #'+combobox3.text+'-'+combobox4.text+'-1'+'#');
因为有时候单位名称会有重复,我不想要重复的单位!
那你后面加上"group by 单位名称"不就可以了吗?这样按照单位group出来.distinct表示要严格唯一.这不是明摆着出错吗!
大嘴,以后多向你请教,能告诉我你的QQ号码吗?我才开始学DELPHI