用这样一段代码,功能是用来查询开始日期到结束日期的药品购进情况:
adoquery1.Close;
adoquery1.SQL.Text:='SELECT 药品细表.药品编码,药品细表.药品名称,药品细表.规格,药品细表.产地,药品细表.单位, 购进表.零价, 购进表.进价, 购进表.数量,购进表.生产批号,购进表.有效期,购进表.供货单位, 购进表.经手人,购进表.购进日期, 购进表.入库日期, 购进表.id';
adoquery1.SQL.Add(' FROM 购进表 INNER JOIN 药品细表 ON 购进表.药品编号 = 药品细表.药品编号 where 购进日期>=:date1 and 购进日期<=:date2 and 调进=:diaojin');
adoquery1.Parameters.ParamByName('date1').Value:=datetimepicker2.Date;
adoquery1.Parameters.ParamByName('date2').Value:=datetimepicker3.Date;
adoquery1.Parameters.ParamByName('diaojin').Value:='商场';
adoquery1.Open;
if adoquery1.IsEmpty then
begin
showmessage('不存在此期间的商场进货纪录');
N1.Enabled:=true;
exit;
end;
但发现当查询的开始日期和结束日期相同的时候(譬如:要查询从2003-2-20~2003-2-20的记录),查询出来的结果集并不包含2003-2-20的记录,但事实上2003-2-20是有记录的。请问高手为什么会这样子,怎样解决??
adoquery1.Close;
adoquery1.SQL.Text:='SELECT 药品细表.药品编码,药品细表.药品名称,药品细表.规格,药品细表.产地,药品细表.单位, 购进表.零价, 购进表.进价, 购进表.数量,购进表.生产批号,购进表.有效期,购进表.供货单位, 购进表.经手人,购进表.购进日期, 购进表.入库日期, 购进表.id';
adoquery1.SQL.Add(' FROM 购进表 INNER JOIN 药品细表 ON 购进表.药品编号 = 药品细表.药品编号 where 购进日期>=:date1 and 购进日期<=:date2 and 调进=:diaojin');
adoquery1.Parameters.ParamByName('date1').Value:=datetimepicker2.Date;
adoquery1.Parameters.ParamByName('date2').Value:=datetimepicker3.Date;
adoquery1.Parameters.ParamByName('diaojin').Value:='商场';
adoquery1.Open;
if adoquery1.IsEmpty then
begin
showmessage('不存在此期间的商场进货纪录');
N1.Enabled:=true;
exit;
end;
但发现当查询的开始日期和结束日期相同的时候(譬如:要查询从2003-2-20~2003-2-20的记录),查询出来的结果集并不包含2003-2-20的记录,但事实上2003-2-20是有记录的。请问高手为什么会这样子,怎样解决??
datetimepicker3的time属性设置成23:59:59
adoquery1.SQL.Add(' FROM 购进表 INNER JOIN 药品细表 ON 购进表.药品编号 = 药品细表.药品编号 where 购进日期>=:date1 and 购进日期<=:date2 and 调进=:diaojin');
中的
购进日期>=:date1 and 购进日期<=:date2
替换成
购进日期>==:date1 and 购进日期<==:date2
你可以试试看!
SELECT 药品细表.药品编码,药品细表.药品名称,药品细表.规格,药品细表.产地,药品细表.单位, 购进表.零价, 购进表.进价, 购进表.数量,购进表.生产批号,购进表.有效期,购进表.供货单位, 购进表.经手人,购进表.购进日期, 购进表.入库日期, 购进表.id FROM 购进表 INNER JOIN 药品细表 ON 购进表.药品编号 = 药品细表.药品编号 where 购进日期>='2003-2-20' and 购进日期<='2003-2-20' and 调进='商场'
你们也列个标试试吧!如果有解决方法的话就共享出来吧!
datetimepicker.date 是有时间的,格式是:2003-1-1 00:00:00,你需要用format一下。
and strToDateTime('2003-1-1 23:59:59.999)
这样不行的话就没有办法了
datetimepicker.date改为FormatDateTime('yyyy-mm-dd,datetimepicker.date)再比较保证行。
上面错了
上面错了
2、试试不用INNER ON,SQL改成
adoquery1.SQL.Text:='SELECT 药品细表.药品编码,药品细表.药品名称,药品细表.规格,药品细表.产地,药品细表.单位, 购进表.零价, 购进表.进价, 购进表.数量,购进表.生产批号,购进表.有效期,购进表.供货单位, 购进表.经手人,购进表.购进日期, 购进表.入库日期, 购进表.id';
adoquery1.SQL.Add(' FROM 购进表, 药品细表 WHERE 购进表.药品编号 = 药品细表.药品编号 AND (购进日期 BETWEEN :date1 AND :date2) AND 调进=:diaojin');
3、参数设置的语句改成:
adoquery1.Parameters.ParamByName('date1').Value := Int(datetimepicker2.Date);
adoquery1.Parameters.ParamByName('date2').Value := Int(datetimepicker3.Date);
药品细表.产地,药品细表.单位, 购进表.零价, 购进表.进价,
购进表.数量,购进表.生产批号,购进表.有效期,购进表.供货单位,
购进表.经手人,购进表.购进日期, 购进表.入库日期, 购进表.
FROM 购进表 INNER JOIN 药品细表
ON 购进表.药品编号 = 药品细表.药品编号
where Convert(Varchar(10),购进表.购进日期,121)>='''
+FormatDateTime('yyyy-mm-dd',datetimepicker2.Date)
+''' and Convert(varchar(10),购进表.购进日期,121)<='''
+FormatDateTime('yyyy-mm-dd',datetimepicker2.Date)
+''' and 调进=:diaojin'先不用参数试试,这样不可能不行,因为我一直都是这样做的。