Firebird Documentation IndexFirebird 2.5 SprachreferenzDatentypen und Unterdatentypen → Datentyp-Konvertierungen
Firebird Home Firebird Home Zurück: SpezialdatentypenFirebird Documentation IndexNach oben: Datentypen und UnterdatentypenWeiter: Benutzerdefinierte Datentypen—Domains

Datentyp-Konvertierungen

Inhaltsverzeichnis

Explizite Datentyp-Konvertierung
Implizite Datentyp-Konvertierung

Wenn Sie einen Ausdruck erstellen oder eine Operation spezifizieren, sollte das Ziel sein, kompatible Datentypen als Operanden zu verwenden. Wenn die Notwendigkeit besteht, verschiedene Datentypen zu verwenden, müssen Sie einen Weg finden, diese inkompatiblen Typen vor der eigentlichen Operation zu konvertieren. Wenn Sie mit Dialekt 1 arbeiten, kann dies zum Problem werden.

Explizite Datentyp-Konvertierung

Die CAST-Funktion ermöglicht die explizite Konvertierung zwischen diversen Datentypen.

Syntax: 

       CAST ( { <value> | NULL } AS <data_type>)

       <data_type> ::= sql_datatype |
                        [TYPE OF] domain |
                        TYPE OF COLUMN relname.colname
        

Casting zu einer Domain

Beim Ausführen eines Cast zu einer Domain, werden alle Constraints berücksichtigt, die hierfür deklariert wurden, z.B. NOT NULL- oder CHECK-Constraints. Wenn der Wert (<value>) diese Prüfung nicht besteht, schlägt der Cast fehl.

Wird TYPE OF zusätzlich angegeben —Umwandlung auf den Basistyp—, werden alle Domain-Contraints während des Cast ignoriert. Wird TYPE OF mit einem Zeichentyp (CHAR/VARCHAR) verwendet, werden der Zeichensatz und die Collation beibehalten.

Casting zu TYPE OF COLUMN

Werden Operanden auf den Datentyp einer Spalte konvertiert, kann die angegebene Spalte aus einer Tabelle oder View stammen.

Nur der Typ der Spalte selbst wird verwendet. Für Zeichentypen wird der Zeichensatz bei der Konvertierung inkludiert, jedoch nicht die Collation. Die Constraints und Vorgabewerte der Quellspalte werden nicht angewandt.

Beispiel: 

       CREATE TABLE TTT (
           S VARCHAR (40)
           CHARACTER SET UTF8 COLLATE UNICODE_CI_AI);
       COMMIT;

       SELECT
         CAST ('I have many friends' AS TYPE OF COLUMN TTT.S)
       FROM RDB$DATABASE;
          

Mögliche konvertierungen für die CAST-Funktion

Tabelle 3.6. Konvertierungen mit CAST

von Datentyp zu Datentyp
Numerische Typen Numerische Typen, [VAR]CHAR, BLOB
[VAR]CHAR [VAR]CHAR, BLOB, Numerische Typen, DATE, TIME, TIMESTAMP
BLOB [VAR]CHAR, BLOB, Numerische Typen, DATE, TIME, TIMESTAMP
DATE, TIME [VAR]CHAR, BLOB, TIMESTAMP
TIMESTAMP [VAR]CHAR, BLOB, DATE, TIME


Wichtig

Beachten Sie, dass Informationsteile möglicherweise verloren gehen. Zum Beispiel geht der Zeitteil bei der Konvertierung eines TIMESTAMP zu einem DATE verloren.

Literalformate

Für den Cast von String-Datentypen zu DATE-, TIME- oder TIMESTAMP-Datentypen, müssen Sie eines der vordefinierten Datum- bzw. Zeit-Literale (vgl. Tabelle 3.7) oder ein gültiges Datum-Zeit-Literal-Format verwenden:

       <datetime_literal> ::= {
         [YYYY<p>]MM<p>DD[<p>HH[<p>mm[<p>SS[<p>NNNN]]]] |
         MM<p>DD[<p>YYYY[<p>HH[<p>mm[<p>SS[<p>NNNN]]]]] |
         DD<p>MM[<p>YYYY[<p>HH[<p>mm[<p>SS[<p>NNNN]]]]] |
         MM<p>DD[<p>YY[<p>HH[<p>mm[<p>SS[<p>NNNN]]]]] |
         DD<p>MM[<p>YY[<p>HH[<p>mm[<p>SS[<p>NNNN]]]]] |
         NOW |
         TODAY |
         TOMORROW |
         YESTERDAY
       }

       <date_literal> ::= {
         [YYYY<p>]MM<p>DD |
         MM<p>DD[<p>YYYY] |
         DD<p>MM[<p>YYYY] |
         MM<p>DD[<p>YY] |
         DD<p>MM[<p>YY] |
         TODAY |
         TOMORROW |
         YESTERDAY
       }

       <time_literal> := HH[<p>mm[<p>SS[<p>NNNN]]]

       <p> ::= whitespace | . | : | , | - | /

          

Tabelle 3.7. Formatierungsargumente für Datum- und Zeit-LiteraleDate and Time Literal

Argument Beschreibung
datetime_literal Datum- und Zeit-Literal
time_literal Zeit-Literal
date_literal Datum-Literal
YYYY vierstelliges Jahr
YY zweistelliges Jahr
MM Monat. Dieser kann aus 1 oder 2 Stellen bestehen (1-12 oder 01-12). Sie können auch die mit drei Buchstaben abgekürzte Form oder den vollen Monatsnamen in englisch angeben. Dies berücksichtigt keine Groß- und Kleinschreibung.
DD Tag. Kann aus 1 oder 2 Stellen bestehen (1-31 oder 01-31)
HH Stunde. Kann aus 1 oder 2 Stellen bestehen (0-23 oder 00-23)
mm Minute. Kann aus 1 oder 2 Stellen bestehen (0-59 oder 00-59)
SS Sekunde. Kann aus 1 oder 2 Stellen bestehen (0-59 oder 00-59)
NNNN Zehntausendstel Sekunde. Kann aus 1 bis 4 Stellen bestehen (0-9999)
p Separator, jedes gültige Zeichen. Führende und nachgestellte Leerzeichen werden ignoriert.


Tabelle 3.8. Literale mit vordefinierten Datums- und Zeitwerten

Literal Beschreibung Datentyp
Dialekt 1 Dialekt 3    
'NOW' Aktuelles Datum und Zeit DATE TIMESTAMP
'TODAY' Aktuelle Datum DATE mit Nullzeit DATE
'TOMORROW' Heutiges Datum + 1 (Tag) DATE mit Nullzeit DATE
'YESTERDAY' Heutiges Datum - 1 (Tag) DATE mit Nullzeit DATE


Wichtig

Die Nutzung des Jahres in vierstelliger Schreibweise —YYYY—wird dringend empfohlen, um Verwirrungen bei der Datumsberechnung und bei Aggregationen zu vermeiden.

Beispiele für die Interpretation von Datum-Literalen: 

       select
         cast('04.12.2014' as date) as d1, -- DD.MM.YYYY
         cast('04 12 2014' as date) as d2, -- MM DD YYYY
         cast('4-12-2014' as date) as d3,  -- MM-DD-YYYY
         cast('04/12/2014' as date) as d4, -- MM/DD/YYYY
         cast('04,12,2014' as date) as d5, -- MM,DD,YYYY
         cast('04.12.14' as date) as d6,   -- DD.MM.YY
         -- DD.MM with current year
         cast('04.12' as date) as d7,
         -- MM/DD with current year
         cast('04/12' as date) as d8,
         cast('2014/12/04' as date) as d9, -- YYYY/MM/DD
         cast('2014 12 04' as date) as d10, -- YYYY MM DD
         cast('2014.12.04' as date) as d11, -- YYYY.MM.DD
         cast('2014-12-04' as date) as d12, -- YYYY-MM-DD
         cast('4 Jan 2014' as date) as d13, -- DD MM YYYY
         cast('2014 Jan 4' as date) as dt14, -- YYYY MM DD
         cast('Jan 4, 2014' as date) as dt15, -- MM DD, YYYY
         cast('11:37' as time) as t1, -- HH:mm
         cast('11:37:12' as time) as t2, -- HH:mm:ss
         cast('11:31:12.1234' as time) as t3, -- HH:mm:ss.nnnn
         cast('11.37.12' as time) as t4, -- HH.mm.ss
         -- DD.MM.YYYY HH:mm
         cast('04.12.2014 11:37' as timestamp) as dt1,
         -- MM/DD/YYYY HH:mm:ss
         cast('04/12/2014 11:37:12' as timestamp) as dt2,
         -- DD.MM.YYYY HH:mm:ss.nnnn
         cast('04.12.2014 11:31:12.1234' as timestamp) as dt3,
         -- MM/DD/YYYY HH.mm.ss
         cast('04/12/2014 11.37.12' as timestamp) as dt4
       from rdb$database
          

Kurzschreibweisen für Casts von Datums- und Zeit-Datentypen

Firebird erlaubt die Verwendung von Kurzschreibweisen („C-Stil“) für die Konvertierung von Strings zu DATE-, TIME- und TIMESTAMP-Typen.

Syntax: 

       data_type 'date_literal_string'
          

Beispel: 

-- 1
       UPDATE PEOPLE
       SET AGECAT = 'SENIOR'
       WHERE BIRTHDATE < DATE '1-Jan-1943';
-- 2
       INSERT INTO APPOINTMENTS
       (EMPLOYEE_ID, CLIENT_ID, APP_DATE, APP_TIME)
       VALUES (973, 8804, DATE 'today' + 2, TIME '16:00');
-- 3
       NEW.LASTMOD = TIMESTAMP 'now';
          

Anmerkung

Diese Kurzschreibweisen werden direkt während des Parsens ausgewertet, so als ob das Statement bereits für die Ausführung vorbereitet wäre. Dadurch hat beispielsweise timestamp 'now' immer den gleichen Wert, egal wie viel Zeit verstrichen ist.

Benötigen Sie hingegen eine Möglichkeit, die die Zeit bei jeder Ausführung neu ermittelt, müssen Sie die vollständige CAST-Syntax verwenden. Eine beispielhafte Verwendung eines solchen Ausdrucks in einem Trigger:

       NEW.CHANGE_DATE = CAST('now' AS TIMESTAMP);
              

Implizite Datentyp-Konvertierung

Implizite Datenkonvertierung ist in Dialekt 3 nicht möglich — die CAST-Funktion wird fast immer benötigt, um Datentyp-Probleme zu vermeiden.

In Dialekt 1 wird in vielen Fällen ein Datentyp implizit in einen anderen gewandelt, ohne die CAST-Funktion verwenden zu müssen. Beispielsweise ist die folgende Klausel in einem SELECT-Statement in Dialekt 1 gültig:

       WHERE DOC_DATE < '31.08.2014'
        

und der String-Typ wird implizit in den Datums-Datentyp gewandelt.

In Dialekt 1 ist das Vermischen von Ganzzahlendaten und numerischen Zeichenketten grundsätzlich möglich, da der Parser versuchen wird, die Zeichenketten implizit zu konvertieren. Beispielsweise wird

       2 + '1'
        

korrekt ausgeführt.

In Dialekt 3 wird dieser Ausdruck einen Fehler ausgeben. Somit sind Sie gezwungen, einen CAST-Ausdruck zu erstellen:

       2 + CAST('1' AS SMALLINT)
        

Die Ausnahme bildet hier die String-Verkettung.

Implizite Konvertierung während der String-Verkettung

Werden mehrere Elemente miteinander verkettet, werden alle nicht-Zeichen-Daten unter der Hand zu einer Zeichenkette konvertiert, sofern möglich.

Beispiel: 

       SELECT 30||' days hath September, April, June and November' CONCAT$
         FROM RDB$DATABASE

       CONCAT$
       ------------------------------------------------
       30 days hath September, April, June and November
          
Zurück: SpezialdatentypenFirebird Documentation IndexNach oben: Datentypen und UnterdatentypenWeiter: Benutzerdefinierte Datentypen—Domains
Firebird Documentation IndexFirebird 2.5 SprachreferenzDatentypen und Unterdatentypen → Datentyp-Konvertierungen