数据库的时间(或日期时间)字段只能保存合法时间,不能超过24小时?(100分)

  • 主题发起人 主题发起人 zheng
  • 开始时间 开始时间
Z

zheng

Unregistered / Unconfirmed
GUEST, unregistred user!
需要计算一段持续的时间,如在线时间,然后要将此持续时间保存在数据库,
但数据库的时间(或日期时间)字段只能保存合法时间,不能超过24小时,
但我们计算的持续时间有时是需要超过24小时的,那么就不能保存了,但我们
又不能将该字段设为字符类型,因为要计算<用SQL的SUM()>?谁有好办法,如能
将时间转换为浮点型,而且能判断时间的合法性,如不能出现"20小时61分62秒"?
 
什么意思?
什么叫不能超过24小时? 看不懂.
超过24小时当然就是1天零几小时啦
用Delphi直接读取这个日期字段然后把它当Double看不就没什么问题了吗?
这个Double型是个天数(1899年12月31日至今所经过的天数), 如果要显示成小时数
只要将这个数值*24就行了.
保存时将你记录的小时数/24保存成Double型的天数, 将这个数值直接作为DateTime
保存到数据库呗.
你连续记录个几万年都没问题
 
用浮点型,因为TDateTime本来就是浮点型的,用整数部分表示天,这样可以与Delphi的
类型完全兼容,既方便计算又没有溢出问题。
 
日期型的表示的是一个点时间,你要求的是表示一个连续的时间段
你可以用字符串啊,不过要写一小段代码计算你需要累加的时间后
再转化为字符串。
 
日期型的表示的是一个点时间,你要求的是表示一个连续的时间段
你可以用字符串啊,不过要写一小段代码计算你需要累加的时间后
再转化为字符串。这样比较直观。
 
起点已知(1899/12/31), 还有必要即保存起始又保存终止吗?
 
同意沙隆巴斯的主人!用浮点型比较好.
 
浮点型表示,程序简单,计算方便,Sum则更不成问题
 
用浮点数精度上可能会有问题,不如用整形直接以秒为单位记录。
 
oldtime:=now; //Tdatetime
........
........
........
currenttime:=now
timetostr(currenttime-oldtime)可以获得持续时间,但超过24小时,体现在那里?
 
Another_eYes:
把它当Double看是不是用datetimetofloat(time)
然后取整数部分作为天数,小数部分作为时间,但怎样将小数部分分解为时间?
 
>>oldtime:=now; //Tdatetime
>>........
>>........
>>........
>>currenttime:=now
间隔小时数 := Round((currenttime - oldtime) * 24);
记住, TDateTime其实就是Double. 你可以查看TDateTime的定义:
TDateTime = type Double; // 取自System.pas 第263行.
 
Another_eYes:
我是问怎样分解“分”和“秒”
 
天:
Trunk((CurrentTime - oldTime) * 24)
时:
Trunc((CurrentTime - oldTime) * 24 * 60) mod 60
秒:
Trunc(CurrentTime - oldTime) * 24 * 60 * 60) mod 60

ok?
 
DecodeTime(Time: TDateTime; var Hour, Min, Sec, MSec: Word);
procedure DecodeDate(Date: TDateTime; var Year, Month, Day: Word);
procedure DateTimeToSystemTime(DateTime: TDateTime; var SystemTime: TSystemTime);
两个日期型变量相减所得的就是天数,*24就是小时数,*24*60就是分钟数,*24*3600就是
秒数,*24*3600*1000就是毫秒数,其值均为浮点类型,转换为整数就行了!
 
接受答案了.
 
后退
顶部