Join Now

Juletip #17 - dating problemer ?

by SAS Employee GertNissen on ‎12-17-2014 05:08 AM (392 Views)

Har du ind imellem dating problemer?

Når der skal indlæses data fra forskellige kilder er et af problemerne typisk at indlæse dato felter korrekt som SAS datoer. Vi vil jo helst arbejde med rigtige SAS datoer af hensyn til efterfølgende beregninger mm.

Hvis vi indlæser data f.eks. via et SAS Access modul til f.eks. Oracle, Teradata, DB2 eller via f.eks. SAP Survey’eren kender de automatisk kildens format og oversætter automatisk til SAS dato format.

Nogle gange ligger dato’er desværre ’gemt’ i tekstfelter og så læser de ind som tekst i SAS.

Ved indlæsning fra tekst filer skal vi også stadig selv håndtere transformeringen fra tekst til SAS dato format.

Dato’er kan skrives på uendelig mange måder og i SAS findes der informater der kan håndterer stort set det meste:

Tekst dato

SAS format

01/23/1963

mmddyy10.

1/23/1963

mmddyy10.

01/23/63

mmddyy8.

1/23/63

mmddyy8.

January 23,1963

worddate20.

jan 23, 1963

worddate12.

23jan1963

date9.

23jan63

date7.

23-jan-1963

date11.

01-23-63

mmddyy8.

19630123

yymmdd8.

Bemærk at der faktisk ikke findes et SAS informat der indlæse datoer skrevet i wordformat!

På den måde kan man bruge lang tid på at finde det korrekte informat og teste koden. Det kan især give problemer hvis den input kolonne man læser fra i sig selv indeholder mange forskellige dato formater.

Men det er der heldigvis en genvej til at løse Smiley Happy

Stop med at gætte og stop med at bruge de mange ’gamle’ informater, der er nemlig ét informat der i langt de fleste tilfælde kan løse problemet.

Her et simpelt eksempel:

Options DATESTYLE = dmy locale=da_DK;


data dato;

  attrib dato format=date.;

  infile datalines truncover;

  input dato anydtdte20.;

  datalines;

12/01/2014

02/12/2014

12/03/14

04/12/14

December 5, 2009

Dec 6, 2014

7. dec, 2014

08dec2014

09dec14

10-dec-2014

11-12-14

20141213

14DEC2014 14:30:08.5

2014Q4

;

run;


DATESTYLE = dmy styrer hvordan informatet skal opfatte rækkefølgen af dag og måned. Hvis du kører ovenstående kode vil du kunne se et problem i konverteringen - at der er et problem når både dato og måned er 12 og mindre.

"Anydt" løser ikke alle dating problemer, man er nu ganske anvendelig – også når man ikke lige kan huske det præcise/korrekte format.

Der findes tilsvarende informater til at konvertere datetime (ANYDTDTMw) og klokke/time input (ANYDTTMEw)

Mere inspiration:

  1. SAS(R) 9.4 Formats and Informats: Reference - ANYDTDTEw. Informat
  2. sesug Proceedings 2007 - How to Read, Write, and Manipulate SAS® Dates
  3. Fun with SAS® Date/Time Formats and Informats
  4. How to convert the datetime character string to SAS datetime value? (ANYDTDTM and MDYAMPM formats)
  5. PharmaSUG2010 - “Had a Strange DATE” – problem solved. Now as SAS gets older will ANYDT do?
  6. SAS Global Forum 2011 - When “Anydate” Doesn’t Mean Any Date: A Macro Solution

SAS(R) 9.4 National Language Support (NLS): Reference Guide

  1. DATESTYLE= System Option
  2. LOCALE=
  3. System Option Entries by Category