2个问题请教...(100分)

  • 主题发起人 主题发起人 cAkk
  • 开始时间 开始时间
试试:
d:double;
d:=now;
showmessage(timetostr(d)+':'+timetostr(d+1.15972216008231E-5));
1.15972216008231E-5这个数在你的机器上不一定准。
你可以自己调。
 
TDateTime是1899年12月31日到指定日期之间的天数。
所以转换如下:
function convert(CTime: Cardinal): TDatetime;
begin
result := TDateTime(double(encodedate(1970,1,1))+ctime / 86400);
// 86400 = 60 * 60 * 24(一天中的秒数)
end;
 
eyes: 你的方法好像成功了,不过我要和C程序验证一下,先谢了!
 
1. 应对有误, 必须设置一个double型的中间变量进行计算.
function convert(ctime: cardinal): TDatetime;
var
v:do
uble;
begin
v :=do
uble(encodedate(1970,1,1))+ctime / 86400;
result := TDatetime(v);
end;

2. 笨办法
select * from table
where extract(year from DateTime_Field) = :year
and extract(month from DateTime_field) = :month
and extract(day from DateTime_field) = :day
 
eyes:
1.不用中间变量,直接返回double就可以,因为函数返回值是Tdatetime,会自动转换的;(我正在测试)
2.extract函数怎么写?
 
1. 估计还得要中间变量(我怀疑delphi进行浮点运算时用的是extended型, 最后
将结果转换成要求的类型)
2. 看你的localsql.hlp.
在bde目录下(默认是Program Files/Common Files/Borland Shared/Bde/)
 
eyes:
1.我试了一下,不用中间变量好像结果一样.
这个问题基本解决,美中不足的是: (我是从文件里面读取)
a) 如果C程序保存的时候没有保存time信息,只有date信息,那么返回的天数
比实际天数少(早)一天.
b) 好像time读出的值对不上,不过反正我也不需要time部分,就算了.
2.我是用的ODBC,没用BDE. 你又该向我推荐BDE了吧;-)
还有别的办法吗?
 
1. 那要看你的ctime是从几点几分开始算起的秒数了(0:00? 12:00?)
2. 只有看看access的帮助了. 我没办法了.
 
2.
用select * from table where field>=:dat1 and field<:dat2
parambyname('dat1').asdatetime :=do
uble(trunc(double(now)));
parambyname('dat2').asdatetime :=do
uble(trunc(double(now+1)));
 
呵呵, 是不是systetimetodatetime函数里ctime=systemtime?
 
to cytown: 好像不是把?
简单地说:一个VC的程序,将一个CTime写到了文件里面,假设写进去的是:
4D 5D 04 34
现在要用delphi把这个日期读出来,正确结果应该是: 97-8-28
 
再给个ctime, 最好是下午的时间.
我估计ctime是从中午12:00开始算起的.
所以要加上43200
($34045d4d + 43200) / 86400 + encodedate(1970,1,1)得到的是97-8-28
 
CD AE 05 34 -> 97-8-29
上下午无法知道,因为有误差那部分的数据都是没有保存time部分的,
好像用VC读出来time都是1:1,但是我用delphi读都是17:1:1
 
procedure TForm1.Button1Click(Sender: TObject);
var
d: TDateTime;
v:do
uble;
begin
v :=do
uble(encodedate(1970,1,1))+($3405aecd + 43200) / 86400;
d := tdatetime(v);
showmessage(datetostr(d));
end;

结果正确, 97-8-29
 
现在可以肯定, ctime是从1970-1-1 12:00:00开始计算的秒数
而encodedate(1970,1,1)得到的是1970-1-1 00:00:00. 两者相差半天.
所以将计算结果+0.5就对了.
 
eyes: 你可真行!现在可以说完全成功了,就是time的小时部分大了4小时.
比如,现在你的函数读出来的time都是5:1,用VC读出来的都是1:1.
当然,如果没什么别的可能就算了,因为time部分可以不要. :-)
 
>2.可以用dt1+1天>dt>dt1-1秒来判断.
sql.text:='select * from table1.db where dt between "'+formatdatetime('mm/dd/yyyy',dt1)+' 23:59:59"-1 and "'+formatdatetime('mm/dd/yyyy',dt1)+'"+1';
 
大4小时?
难道CTime是从1970-1-1 8:00开始记数的?
那就继续调整encodedate之后的数值呗. +0.5大4小时, 那么就加 1/3. (0.3333333......)
 
to cAkk:
说实在话,您老先生是不是有点......懒
查查帮助看看TDatetime的含意不就什么都知道了??
 
 关于第2个问题,access我不清楚,在SQL Server里,我是这样干的
left(convert(char(20),时间变量,120),10)
可以取得一个'xxxx-xx-xx'形式的字符串
你可以把时间全部转换成字符串,再进行比较
access和sql server 都是微软的东东,估计这些函数可能都有
 

Similar threads

后退
顶部