如何写这样的SQL语句?(30分)

  • 主题发起人 主题发起人 lkpc
  • 开始时间 开始时间
L

lkpc

Unregistered / Unconfirmed
GUEST, unregistred user!
如何写这样的SQL语句?
有两个问题请大家提供帮助:
1、D6、ADO、ACCESS2000数据库:
记录如下:
ID bdate pname
001 2001-1-5 衣服
002 2001-3-5 食品
003 2001-2-8 衣服
001 2001-2-15 衣服
001 2001-6-5 食品
002 2001-9-8 衣服
003 2001-9-8 衣服
...
条件:对同一ID顾客,购买相同商品只列出第一次购物时间,
购买不同的商品要列出,
得到如下结果:
001 2001-1-5 衣服
001 2001-6-5 食品
002 2001-3-5 食品
002 2001-9-8 衣服
003 2001-2-8 衣服
请问如何写SQL语句?

2 D6、ADO、ACCESS2000数据库:
在SQL语句中使用
select * from demo where datediff("yyyy",date1,now())<10
发现结果不正确,在D5、BDE、ACCESS97中是正确的,现升级到
D6、ADO、ACCESS2000数据库后出现问题,不知谁有经验,datediff
怎么会出现这种问题?(数据库从ACCESS97升级到ACCESS2000,记录没变化)
 
select * from demo group by id,bdate
 
to YNTW:
好像不行吧,同一商品的最初时间如何选择出来?
 
1、我已经解决了:
select id,pname,min(bdate) from demo group by id,pname
2、
现在关键是第二个问题很奇怪,看例子:
ADO、D6、ACCESS2000数据库:
demo表有两条记录:字段为日期型
e11 e7
1945-5-5 2001-1-5
1936-1-8 2001-6-8
写一个简单的SQL语句如下:
计算e7,e11年份差值在4-7之间的记录
i,j:integer;
i:=4;
j:=7;
with ADOquery1 do
begin
sql.Add('select * from demo');
SQL.add(' where DateDiff(''yyyy'',e11,e7)<=:xt2');
SQL.add(' and DateDiff(''yyyy'',e11,e7)>=:xt1');
parameters.ParamByname('xt2').value:=j;
parameters.ParamByname('xt1').value:=i;
open;
end;

这两条记录应该都不符合条件,但却找出来了,问题出在何处?

 
第二个问题我找到出在何处了,但不知道如何解决。
将4,7直接写入SQL语句,不用参数传递,可得到正确结果,看来是参数传递
的问题,但我需要传递参数,因为i,j经常变,用整数不行的话哪用什么类型?
正确:
with ADOquery1 do
begin
sql.Add('select * from demo');
SQL.add(' where DateDiff(''yyyy'',e11,e7)<=7');
SQL.add(' and DateDiff(''yyyy'',e11,e7)>=4');
// parameters.ParamByname('xt2').value:=j;
// parameters.ParamByname('xt1').value:=i;
open;
end;

请高手看看参数如何传递?
 
参数传递是没错的,我认为关键是在datediff()这个函数的使用上。
 
我现在有变通的方法可以进行,但问题是datediff()函数到底怎么啦?
此函数得到应该是整数值吧,现在把整数参数传递过去竟然不行?
而在BDE、D5、ACCESS97库下却是正常的。
 
试试这个:
with ADOquery1 do
begin
sql.Add('select * from demo');
SQL.add(' where DateDiff(''' + 'yyyy' + ''',e11,e7)<= :xt1');
SQL.add(' and DateDiff(''' + 'yyyy' + ''',e11,e7)>= :xt2');
parameters.ParamByname('xt2').value:=j;
parameters.ParamByname('xt1').value:=i;
open;
end;
 
to dlnew: 你的方法也不行。
 
对不起,没看清楚你用的是ACCESS。
看了一下帮助,发现有两个地方有可能出错!试试下面的!
with ADOquery1 do
begin
sql.Add('select * from demo');
SQL.add(' where DateDiff("' + 'y' + '",[e11],[e7])<= :xt1');
SQL.add(' and DateDiff("' + 'y' + '",[e11],[e7])>= :xt2');
parameters.ParamByname('xt2').value:=j;
parameters.ParamByname('xt1').value:=i;
open;
end;

 
^_^!这个问题应该结案了!
 
to DLNEW:还是不行,您很辛苦,结束时我会给您一些分数的!
 
DateDiff(year,e11,e7)<=7 or
 
to ugvanxk:
这是我写的语句呀,我知道这样做正确,但变量是需要传递的,
现在主要是在传递时有问题。
 
用字符串方式进行参数传递,不要用整形即可。
 
主意不错!成功!
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
633
import
I
后退
顶部