2009-10-14 159 views
2

有人能解釋其中的變量最高精度數字D4至D7是從哪裏來的?日期時間與SAS毫秒:最高精度數字無處

的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 

回答

2
自1960年1月1日,

SAS日期時間值存儲爲秒數,所以我敢肯定這是造成由用二進制浮點數表示基數爲10的數字的問題。例如參見this article

我現在無法訪問SAS,因此無法檢查,但我例如2504年12月31日23:59:59:997將存儲爲17198611199.997。這裏沒有精度損失,所以當SAS將數字格式化回日期時間表示時,會導致錯誤。

使用Python照此計算,我得到

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

這是給定秒數轉換爲199057天,86399秒和99702微秒。

+0

感謝。 Python示例也很有幫助。 – 2009-10-17 18:29:12