Fedsql

Datumsvergleiche in FedSQL verwalten

Simon 12 views

Die Ankunft von SAS© Viya und der CAS (Cloud Analytic Services) Engine führte die Verwendung von FedSQL ein, einer standardisierten Implementierung der SQL-Sprache, die für Skalierbarkeit entwickelt wurde. FedSQL ist jedoch viel strenger als das klassische PROC SQL von SAS© Base, insbesondere in Bezug auf Datentypen.

Ein häufiger Fehler tritt beim Filtern von Datumsangaben über numerische Makrovariablen auf.

Das Problem: Starke vs. Schwache Typisierung

Im klassischen SAS© (Base SAS©) ist ein Datum nichts anderes als eine Zahl (die Anzahl der Tage seit dem 1. Januar 1960). Sie können also problemlos schreiben: WHERE ma_colonne_date > 23040.

In FedSQL sind die Typen streng. Eine als DATE definierte Spalte kann nicht direkt mit einem INTEGER (Ganzzahl) verglichen werden. Wenn Sie versuchen, eine rohe numerische Makrovariable in Ihre CAS-Abfrage einzufügen, erhalten Sie den folgenden Fehler:

ERROR: Operator is not unique: DATE > INTEGER

Dies bedeutet, dass die Engine nicht weiß, wie diese beiden inkompatiblen Datentypen ohne explizite Konvertierung verglichen werden sollen.

Die Lösung: Das ANSI-Format

FedSQL entspricht dem ANSI-SQL-Standard. Um nach einem Datum zu filtern, müssen Sie einen Literalwert in der spezifischen Form angeben: DATE 'YYYY-MM-DD'

Die technische Herausforderung besteht darin, Ihre numerische Makrovariable (z.B. 23040) in einen formatierten Zeichenfolge (z.B. '2023-01-30') umzuwandeln, während die Einschränkungen der SAS©-Makrosprache (Anführungszeichen, Bindestriche) beachtet werden müssen.

Das technische Rezept

Um diese Zeichenfolge dynamisch zu erstellen, müssen wir drei Tools kombinieren:

  1. PUTN : Um die Rohzahl in ein Datumsformat mit Bindestrichen (yymmddd10.) umzuwandeln.

  2. %QSYSFUNC : Um PUTN auszuführen und dabei die Bindestriche (-) zu maskieren. Ohne das Q (Quoting) könnte SAS© die Bindestriche im Datum (2023**-01-**30) als "Minuszeichen" (Subtraktion) interpretieren.

  3. %TSLIT : Ein von SAS© bereitgestelltes Makro, das das Problem der Anführungszeichen löst. In SQL müssen Literale in einfache Anführungszeichen ('Wert') eingeschlossen werden, aber SAS©-Makros können nicht innerhalb einfacher Anführungszeichen aufgelöst werden. %TSLIT (Time Share Literal) generiert eine Zeichenfolge in einfachen Anführungszeichen und ermöglicht gleichzeitig die Auflösung des Makros darin.

Der korrigierte Code

So setzen Sie diese Elemente für eine robuste FedSQL-Abfrage zusammen:

1/* Exemple : Macro variable contenant une date numérique SAS */
2%let Aujourdhui = 23040;
3 
4PROC FEDSQL;
5 select * from ma_librairie.ma_table_cas
6 /* La syntaxe magique : DATE suivi de la chaîne formatée */
7 where dateColumn >= date %tslit(%qsysfunc(putn(&Aujourdhui, yymmddd10.)));
8QUIT;
Schauen wir uns an, was bei der Kompilierung der WHERE-Zeile passiert:

putn(&Aujourdhui, yymmddd10.) wandelt 23040 in 2023-01-30 um.

%qsysfunc schützt die Zeichenfolge 2023-01-30, sodass sie als reiner Text behandelt wird.

%tslit umschließt alles, um '2023-01-30' zu erzeugen.

Der endgültige Code, der an den CAS-Server gesendet wird, ist: where dateColumn >= date '2023-01-30'

Wenn Sie mit FedSQL in CAS arbeiten:

  • Vergessen Sie den direkten Vergleich von Datum und Zahl.

  • Verwenden Sie immer das ANSI-Literal DATE 'YYYY-MM-DD'.

  • Verwenden Sie die Kombination %TSLIT + %QSYSFUNC, um Ihre Makrovariablen sauber einzufügen.