SAS中的日期时间(以毫秒为单位):无处不在的最高精度数字

时间:2009-10-14 09:56:13

标签: datetime sas

有人可以解释变量d4到d7中最高精度数的来源吗?

SAS计划:

data foo;         
    format d1-d7 datetime30.6; 
    timestring = "23:59:59.997000000"; 
    time = input(timestring,time18.); 
    d1 = dhms(0,0,0,time); 
    d2 = dhms('08DEC1981'd,0,0,time); 
    d3 = dhms('31DEC2503'd,0,0,time); 
    d4 = dhms('31DEC2504'd,0,0,time); 
    d5 = dhms('08DEC2981'd,0,0,time); 
    d6 = dhms('08DEC4981'd,0,0,time); 
    d7 = dhms('08DEC9999'd,0,0,time); 
run; 
proc print;run; 

输出:

Obs                             d1                             d2                             d3 

  1       01JAN1960:23:59:59.997000      08DEC1981:23:59:59.997000      31DEC2503:23:59:59.997000 

 Obs                             d4                             d5                             d6 

  1       31DEC2504:23:59:59.997002      08DEC2981:23:59:59.997002      08DEC4981:23:59:59.996994 

 Obs                             d7        timestring          time 

  1       08DEC9999:23:59:59.997009    23:59:59.997000000    86400.00 

1 个答案:

答案 0 :(得分:2)

SAS日期时间值存储为自1960年1月1日以来的秒数,所以我很确定这是由使用二进制浮点数表示基数为10的数字的问题引起的。请参阅示例this article

我现在无法访问SAS,所以我无法查看,但我例如,12月31日,2504,23:59:59:997将存储为17198611199.997。这里没有精度损失,因此当SAS将数字格式化回日期时间表示时会导致错误。

使用Python进行相同的计算

>>> from datetime import timedelta
>>> timedelta(seconds=17198611199.997)
datetime.timedelta(199057, 86399, 997002)

这是给定的秒数转换为199057天,86399秒和99702微秒。