急:TDateTime类型数据更新到ACCESS中的日期时间字段的时间丢失了.(50分)

  • 主题发起人 主题发起人 lyj.hm
  • 开始时间 开始时间
L

lyj.hm

Unregistered / Unconfirmed
GUEST, unregistred user!
我用DELPHI访问ACCESS,其中ACCESS中一个字段InDate是日期时间类型(格式选的常规日期),现在我在DELPHI中更新一个TDateTime的值(在DELPHI中使用NOW函数)到ACCESS数据库中,发现时间数据丢失了,在数据库中显示为"上午12:00",我该如何正确的存储时间信息到数据库中呢?
//代码如下========================================================
try
rst.SQL.Clear;
InDate=now();
SQL:='Update tCardInfo set InDate=:pInDate where ID=:pID';
rst.SQL.Add(SQL);

rst.Parameters.ParamByName('pID').Value:=uID;
rst.Parameters.ParamByName('pInDate').Value:=InDate;
rst.ExecSQL;
finally
rst.Close;
rstState:=False;
 
先检查你手工在Access表中输入InDate字段时间是什么样子的?可以显示日期吗?
 
我有一个默认值为now(),是可以正常显示日期的,但是一旦我更新一个日期(如上操作),时间就不见了,只剩下日期
 
到底是只剩下日期还是只剩下时间啊?
 
只剩下日期,没有时间
 
你用DateTimeToStr()函数把日期转换为字符串然后存储试试看
 
试试这个吧

//时间转整数
function time_t_to_TDateTime(time: LongInt): TDateTime;
var TI: TTimeZoneInformation;
HourofCur: Integer;
begin
GetTimeZoneInformation(TI); //获取时区信息 UTC = local time + bias ,so local time = UTC - bias
HourofCur := -1 * TI.Bias div 60;
result := IncHour(IncSecond(EncodeDateTime(1970, 1, 1, 0, 0, 0, 0), time) , HourofCur);
end;
//
//整数转时间
function tdatetime_to_time_t(time: TDateTime): Longint;
var
yy: Word;
TI: TTimeZoneInformation;
HourofCur: Integer;
newDateTime: TDateTime;
begin
GetTimeZoneInformation(TI); //获取时区信息 UTC = local time + bias ,so local time = UTC - bias
HourofCur := -1 * TI.Bias div 60;
newDateTime := IncHour(time, HourofCur);
{result := 0;
yy := YearOf(time);
if (yy >= 1970) and (yy <= 2038) then
result := abs(SecondsBetween(time, EncodeDateTime(1970, 1, 1, 0, 0, 0, 0)));}
Result := 0;
yy := YearOf(newDateTime);
if (yy >= 1970) and (yy <= 2038) then
Result := abs(SecondsBetween(newDateTime, EncodeDateTime(1970, 1, 1, 0, 0, 0, 0)));
end;
 
MyDateTime:=FormatDateTime('#yyyy-MM-dd hh::mm::ss#,now);
将MyDateTime加到你的SQL语句里就行了;
 
最佳答案:
在测试的过程中,我无意中找到了一个最简单的方法。与大家共勉:
1:在DELPHI中将日期字段的值赋给一个DOUBLE类型的变量
var InDate:Double;
InDate:=now();
2:将该Double变量的值直接更新到ACCESS数据库中。但是数据库的对应字段的类型选择为“日期/时间”类型。
SQL:='Update tCardInfo set InDate=:pInDate where ID=:pID';
rst.SQL.Add(SQL);

rst.Parameters.ParamByName('pID').Value:=uID;
rst.Parameters.ParamByName('pInDate').Value:=InDate;
rst.ExecSQL;

问题解决了。
分析原因:如果在DELPHI中使用TDATETIME类型时,DELPHI把这个日期时间类型的值转换为DELPHI能识别的日期/时间格式,但这个格式却不被ACCESS所接受,所以就把时间部分删除了。如果将一个日期时间的对应的双精度小数给ACCESS,让ACCESS自己去转换为对应的日期格式,就不会出错了。
 
后退
顶部