Wenn man mit SAS© und der SQL-Prozedur (PROC SQL) beginnt, ist ein häufiger Fehler, numerische Variablen so zu behandeln, als wären sie Zeichenketten.
Ein klassischer Fall ist eine ID- oder Datumsspalte, die im numerischen Format gespeichert ist (zum Beispiel 20190901 für den 1. September 2019). Wenn Sie versuchen, die Funktion SUBSTR zu verwenden, um das Jahr "2019" in einer WHERE-Klausel zu extrahieren, wird SAS© einen Fehler zurückgeben.
Warum? Weil SUBSTR eine Zeichenkette erwartet und keine Zahl. Außerdem führt der Versuch, das Ergebnis (Zeichenkette) mit einer Zahl (2019) zu vergleichen, zu einer Typ-Inkompatibilität.
Hier sind drei Methoden, um dieses Problem zu lösen, von der "mathematischsten" bis zur "Best Practice".
Wenn Ihre Spalte numerisch ist, ist die leistungsstärkste Lösung oft, im numerischen Bereich zu bleiben. Anstatt zu versuchen, den Text zu schneiden, verwenden Sie die Mathematik.
Stellen wir uns eine Variable date_id vor, die 20190901 enthält. Um die ersten 4 Ziffern (das Jahr) zu erhalten, teilen Sie einfach durch 10.000 und behalten nur den ganzzahligen Teil.
SAS©-Code:
Wenn Sie einen Teil in der Mitte der Zahl extrahieren müssten, würde die Logik komplexer werden (eine Mischung aus Subtraktionen und Divisionen), was diese Methode für komplexe Extraktionen weniger lesbar macht.
Wenn Sie die Variable unbedingt als Text behandeln möchten, müssen Sie sie explizit konvertieren. Es reicht nicht aus, PUT zu verwenden; oft müssen Sie die Leerzeichen verwalten, die bei der Konvertierung eingefügt werden können.
Diese Methode ist jedoch oft umständlicher und anfälliger für Vergleichsfehler (Vergleich einer Zeichenkette '2019' mit der Zahl 2019).
Wenn Ihre numerische Variable tatsächlich ein Datum darstellt (wie 20190901), ist die robusteste und sauberste Methode, sie in einen echten SAS©-Datumswert umzuwandeln. Einmal konvertiert, können Sie die leistungsstarken Zeitfunktionen von SAS© (YEAR, MONTH, DAY) verwenden.
Um eine Zahl JJJJMMTT in ein SAS©-Datum umzuwandeln, verwendet man die Kombination aus INPUT und PUT:
PUT(date_id, 8.): Wandelt die Zahl in eine Zeichenkette um.
INPUT(..., yymmdd8.): Liest diese Zeichenkette, um ein gültiges SAS©-Datum zu erstellen.
SAS©-Code: