2009-10-14 6 views
2

Quelqu'un peut-il expliquer d'où proviennent les nombres de précision les plus élevés dans les variables d4 à d7?Datetime avec millisecondes dans SAS: nombres de précision les plus élevés de nulle part

Le programme 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; 

La sortie:

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 

Répondre

2

valeurs datetime SAS sont stockés comme le nombre de secondes depuis le 1er Janvier 1960, donc je suis assez sûr que cela est causé par les problèmes de représentation des nombres de base 10 avec des nombres à virgule flottante binaires. Voir par exemple this article.

Je n'ai pas accès à SAS maintenant, donc je ne peux pas vérifier, mais je par exemple 31 décembre 2504, 23: 59: 59: 997 serait stocké comme 17198611199.997. Il n'y a pas de perte de précision ici, donc l'erreur serait causée lorsque SAS reformate le numéro à la représentation datetime.

En utilisant Python pour faire le même calcul je reçois

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

C'est le nombre de secondes convertit en 199057 jours, 86399 secondes et 99702 microsecondes.

+0

Merci. L'exemple Python était également utile. –