我在查询一个时间段时查到的结果老是少一天! ( 积分: 200 )

  • 主题发起人 主题发起人 delphi123456
  • 开始时间 开始时间
D

delphi123456

Unregistered / Unconfirmed
GUEST, unregistred user!
请看一下下边的代码:
if (myitem.CreationTime >= cxDateEdit1.Text)
and (myitem.CreationTime <=cxDateEdit2.Text) then
begin
我在查询时老是漏掉与myitem.CreationTime = cxDateEdit2.Text这一天,请问是怎么回事啊?
还有这个代码:
if (CheckBox1.Checked = true)and(CheckBox2.Checked = true) then
begin
在查询时只是CheckBox1所对应的项有效,CheckBox2对应当项没用,这个有时怎么回事呢?
 
请看一下下边的代码:
if (myitem.CreationTime >= cxDateEdit1.Text)
and (myitem.CreationTime <=cxDateEdit2.Text) then
begin
我在查询时老是漏掉与myitem.CreationTime = cxDateEdit2.Text这一天,请问是怎么回事啊?
还有这个代码:
if (CheckBox1.Checked = true)and(CheckBox2.Checked = true) then
begin
在查询时只是CheckBox1所对应的项有效,CheckBox2对应当项没用,这个有时怎么回事呢?
 
干脆把时间+1好了,多一天再查找就好了.我也碰到过这个问题
你的Checkbox1和Checkbox2是不是成组的啊,成组的是不可能两个都能选中的
 
你的第一个问题会不会是遇你的字段数据类型有关呀?

如你的数据库字段类型是datatime,它的数据是有时分秒的,而你的cxDateEdit2.Text是没有时分秒的吧
 
if ((CheckBox1.Checked = true)and(CheckBox2.Checked = true)) then
begin
 
假如cxDateEdit2.Text输的是2005年9月16日,实际上是2005年9月16日0时0分0秒,
你要查的myitem.CreationTime可能也是2005年9月16日,可实际上可能是2005年9月16日8时9分10秒,所以myitem.CreationTime <=cxDateEdit2.Text就不成立了。
知道原因,我想解决就比较容易了。
 
if (CheckBox1.Checked = true)and(CheckBox2.Checked = true) then
与if (CheckBox1.Checked )and(CheckBox2.Checked) then没有区别吧
 
你的检索范围应该是
yyyy-mm-dd 00:00:00 到 yyyy-mm-dd 23:59:59
不然会楼掉最后一天

因为默认
yyyy-mm-dd 就等于 yyyy-mm-dd 00:00:00
 
zhukewen说得很好了,这个字段如果没必要精确到时分秒,建议你保存日期就行了
 
如你的数据库字段类型是datatime,它的数据是有时分秒的,而你的cxDateEdit2.Text是没有时分秒的吧
你的检索范围应该是
yyyy-mm-dd 00:00:00 到 yyyy-mm-dd 23:59:59
不然会楼掉最后一天
 
我试过了,如果用datetostr函数的话查出来的日期更乱了。
zhukewen,能不能把你的方法说的具体一点?
 
结束日期应该是:2005-09-09 23:59:59格式才对
 
第一个问题已经很清楚了。
第二个问题不明白你的意思,“在查询时只是CheckBox1所对应的项有效,CheckBox2对应当项没用”,你是说CheckBox2是否选中对你的布尔表达式的值都没影响?
(CheckBox1.Checked = true)and(CheckBox2.Checked = true)
在CheckBox1未选中时,当然CheckBox2的无论是否选中结果都是false;
而CheckBox1选中时,CheckBox2是否选中将决定整个表达式的结果。

难道你的意思是,CheckBox1选中时,仍然无论CheckBox2是否选中也不影响最终结果?怎么可能。
 
myitem.CreationTime
莫非是string类型的???
 
第二个问题我的意思是当我同时选中CheckBox1h和CheckBox2时程序只是执行CheckBox1所对应地项cxTextEdit1中的内容,而不论CheckBox2所对应地项cxTextEdit2中的内容如何都不管用。还有就是第一个问题我还是没明白啊,datetotime和datetimetostr函数我都用过了可是不行!!!
 
把你所有代码贴出来。看得出一定是逻辑上的错!
时间你一定把最后一天加上分秒时或天数加一就可以了。
 
操作符两边的时间类型要一致,都是TDate或TDateTime类型,不要两边不一样!
 
代码如下:
unit Unitword;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,comobj, cxLookAndFeelPainters, cxMemo, cxControls, cxContainer,
cxEdit, cxTextEdit, cxMaskEdit, cxDropDownEdit, cxCalendar, StdCtrls,
cxButtons, DB, ADODB, DBClient, MConnect;

type
TForm1 = class(TForm)
cxButton1: TcxButton;
cxDateEdit1: TcxDateEdit;
cxMemo1: TcxMemo;
cxTextEdit1: TcxTextEdit;
cxDateEdit2: TcxDateEdit;
Label1: TLabel;
CheckBox1: TCheckBox;
CheckBox2: TCheckBox;
DCOMConnection1: TDCOMConnection;
ClientDataSet1: TClientDataSet;
cxButton2: TcxButton;
procedure cxButton1Click(Sender: TObject);
procedure CheckBox1Click(Sender: TObject);
procedure CheckBox2Click(Sender: TObject);
procedure cxButton2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.cxButton1Click(Sender: TObject);
var outlookapp,mapi,mail,myitem:variant;
s :string;
count,i:integer;
begin
count:=0;
try
//创建outlook对象
outlookapp:=createoleobject('outlook.application');
//分配姓名空间
mapi:=outlookapp.getnamespace('MAPI');
//遍历outlook文件夹,找到'已发送的邮件'文件夹
mail:=mapi.Folders('个人文件夹').Folders('已发送的邮件');
except
on E: Exception do
begin
messagedlg(E.Message, mtError, [mbok], 0 );
end;//end of on E: do
end;//end try..except
for i := 1 to mail.Items.count do
begin
myitem := mail.Items;
if (CheckBox1.Checked = true) and (myitem.SenderName = trim(cxTextEdit1.Text)) then
begin
if myitem.SenderName = trim(cxTextEdit1.Text) then
begin
count:=count+1;
s := s+'第 '+inttostr(count)+' 封:';
s := s+#13+#13+'发件人:'+myitem.sendername;
s := s+#13+#13+'收件人:'+vartostr(myitem.Recipients[1].address);
s := s+#13+#13+'主题: '+myitem.subject;
s := s+#13+#13+'发送时间:'+datetimetostr(myitem.CreationTime);
s := s+#13+#13+'内容:'+#13+#13+myitem.body;
s := s+#13+#13+'大小:'+inttostr(myitem.Size)+'byte'+#13+#13;
end;//end if ..then
end//end if ..then begin
else if (CheckBox2.Checked = true) then
begin
if (myitem.CreationTime >= cxDateEdit1.Text)
and(myitem.CreationTime <= cxDateEdit2.Text) then //?第一处问题所在!!
begin
count:=count+1;
s := s+#13+'第 '+inttostr(count)+' 封:';
s := s+#13+#13+'发件人:'+myitem.sendername;
s := s+#13+#13+'收件人:'+vartostr(myitem.Recipients[1].address);
s := s+#13+#13+'主题: '+myitem.subject;
s := s+#13+#13+'发送时间:'+datetimetostr(myitem.CreationTime);
s := s+#13+#13+'内容:'+#13+#13+myitem.body;
s := s+#13+#13+'大小:'+inttostr(myitem.Size)+'byte'+#13+#13;
end; //end if ..then

end//end else if..
else if ((CheckBox1.Checked = true)and(CheckBox2.Checked = true)) then //?第二处问题所在!!
begin
if ((myitem.CreationTime >= cxDateEdit1.Text)
and (myitem.CreationTime <= cxDateEdit2.Text)
and (myitem.SenderName=cxTextEdit1.Text)) then
begin
count:=count+1;
s := s+'第 '+inttostr(count)+' 封:';
s := s+#13+#13+'发件人:'+myitem.sendername;
s := s+#13+#13+'收件人:'+vartostr(myitem.Recipients[1].address);
s := s+#13+#13+'主题: '+myitem.subject;
s := s+#13+#13+'发送时间:'+datetimetostr(myitem.CreationTime);
s := s+#13+#13+'内容:'+#13+#13+myitem.body;
s := s+#13+#13+'大小:'+inttostr(myitem.Size)+'byte'+#13+#13;
end;//end if ..then
end;//end else if };
cxMemo1.Lines.Text:=s;
oulookapp := Unassigned;
end;
end;
 
你的if (myitem.CreationTime >= cxDateEdit1.Text)
and (myitem.CreationTime <=cxDateEdit2.Text) then
begin
也不是SQL语句啊,你想如何查询呢????
 
我做的是三层的这边是客户端的程序
 

Similar threads

后退
顶部