[PYTHON] [Einführung in cx_Oracle] (17.) Datumsbehandlung

Serialisierungstabelle

Serie: Einführung in den Inhalt von cx_Oracle

Überprüfungsumgebung

Vorbereitungen

Bitte erstellen Sie die folgende Tabelle.

sample17.sql


create table sample17(
      col_date date
    , col_ts   timestamp(9)
    , col_tz   timestamp(9) with time zone
);

Grundlegende Behandlung vom Typ DATE

Wie in 6. und 9. erläutert, Typ DATE Der entsprechende Python-Typ für ist datetime.datetime. Für den Typ DATE können Sie normal mit DB austauschen, indem Sie ihn an datetime.datetime übergeben. Datetime.datetime kann auch Werte bis zu Mikrosekunden verarbeiten, der Typ DATE kann jedoch nur Werte bis zu Sekunden verarbeiten, sodass Werte unter Sekunden abgeschnitten werden. Unten finden Sie Beispiele und Ausführungsergebnisse. Ich erhalte den Wert, der zum Zeitpunkt von SELECT um einen Tag vorverlegt wurde, damit ich sehen kann, dass er sich auf einen anderen Wert bezieht.

sample17a.py


import cx_Oracle
import datetime

USERID = "admin"
PASSWORD = "FooBar"
DESTINATION = "atp1_low"
SQL1 = "insert into sample17(col_date) values(:now)"
SQL2 = "select col_date + 1 from sample17"

sys_date = datetime.datetime.now()
print("AP-Wert:", sys_date)
with cx_Oracle.connect(USERID, PASSWORD, DESTINATION) as conn:
    with conn.cursor() as cur:
        cur.execute("truncate table sample17")
        cur.execute(SQL1, [sys_date])
        conn.commit()
        val = cur.execute(SQL2).fetchone()[0]
        print("DB-Wert:", val.strftime("%Y-%m-%d %H:%M:%S.%f"))

$ python sample17a.py
AP-Wert: 2020-09-26 10:48:02.605423
DB-Wert: 2020-09-27 10:48:02.000000

Grundlegende Handhabung vom Typ TIMESTAMP

Wie der Typ DATE unterstützt auch der Typ TIMESTAMP den Python-Typ datetime.datetime. INSERT erfordert jedoch eine zusätzliche Codierung im Vergleich zum DATE-Typ. Wenn die Codierung mit dem Typ DATE identisch ist, wird sie genauso behandelt wie der Typ DATE, und Werte von weniger als einer Sekunde werden abgeschnitten. Im Moment,

  1. Verwenden Sie Prepared Statement
  2. Cursor.setinputsizes () gibt an, dass die entsprechende Bindungsvariable die Größe von cx_Oracle.DB_TYPE_TIMESTAMP hat
  3. Führen Sie SQL aus

Wird benötigt. Unten finden Sie Beispiele und Ausführungsergebnisse. Beachten Sie, dass die SQL-Anweisung, die eines Tages vorgerückt wird, im Gegensatz zum DATE-Typ INTERVAL verwendet. Wenn sie "+1" ist, wird sie in den DATE-Typ umgewandelt und Werte unter Sekunden werden abgeschnitten.

sample17b.py


import cx_Oracle
import datetime

USERID = "admin"
PASSWORD = "FooBar"
DESTINATION = "atp1_low"
SQL1 = "insert into sample17(col_ts) values(:now)"
SQL2 = "select col_ts + interval '1' day from sample17"

sys_date = datetime.datetime.now()
print("AP-Wert:", sys_date)
with cx_Oracle.connect(USERID, PASSWORD, DESTINATION) as conn:
    with conn.cursor() as cur:
        cur.execute("truncate table sample17")
        cur.prepare(SQL1)
        cur.setinputsizes(now=cx_Oracle.DB_TYPE_TIMESTAMP)
        cur.execute(None, {"now":sys_date})
        conn.commit()
        val = cur.execute(SQL2).fetchone()[0]
        print("DB-Wert:", val.strftime("%Y-%m-%d %H:%M:%S.%f"))
$ python sample17b.py
AP-Wert: 2020-09-26 23:51:27.832640
DB-Wert: 2020-09-27 23:51:27.832640

Grundlegende Handhabung des Typs TIMESTAMP WITH TIME ZONE und TIMESTAMP WITH LOCAL TIME ZONE

Diese Datentypen können mit derselben Codierung wie der TIMESTAMP-Typ behandelt werden. Setzen Sie die von Cursor.setinputsizes () angegebenen Typen auf cx_Oracle.DB_TYPE_TIMESTAMP_TZ bzw. cx_Oracle.DB_TYPE_TIMESTAMP_LTZ. Zum Zeitpunkt des Schreibens kann es jedoch aktualisiert werden, indem anstelle von nativ eine Erfassungszeit definiert wird. Im Fall von SELECT gehen die Zeitzoneninformationen jedoch verloren, da sie zur nativen Datumszeit empfangen werden. Soweit ich das Handbuch überprüfe, scheint es leider, dass selbst wenn ich Curosr.var () verwende, keine Einstellung zum Empfangen mit bekannter Datums- / Uhrzeitangabe vorhanden ist. Erwarten Sie daher bei Verwendung dieser Datentypen nicht, dass cx_Oracle die Zeitzonendifferenz absorbiert und unter Berücksichtigung der Zeitzonendifferenz mit Python oder SQL codiert (berechnen Sie die Zeitzonendifferenz selbst). Oder versuchen Sie, über eine Zeichenfolge zwischen Python und SQL zu wechseln (z. B. ISO 8601-Format). Das folgende Beispiel zeigt die Verwendung der Datumszeichenfolge im ISO 8601-Format.

sample17c.py


import cx_Oracle
import datetime

USERID = "admin"
PASSWORD = "FooBar"
DESTINATION = "atp1_low"
SQL1 = "insert into sample17(col_tz) values(to_utc_timestamp_tz(:now))"
SQL2 = f"select to_char(col_tz + interval '1' day, 'YYYY-MM-DD\"T\"HH24:MI:SS.ff6\"Z\"') from sample17"

sys_date = datetime.datetime.utcnow().replace(tzinfo=datetime.timezone.utc).isoformat()
print("AP-Wert:", sys_date)
with cx_Oracle.connect(USERID, PASSWORD, DESTINATION) as conn:
    with conn.cursor() as cur:
        cur.execute("truncate table sample17")
        cur.execute(SQL1, [sys_date])
        conn.commit()
        val = cur.execute(SQL2).fetchone()[0]
        print("DB-Wert:", val)
$ python sample17c.py
AP-Wert: 2020-09-27T07:05:42.948348+00:00
DB-Wert: 2020-09-28T07:05:42.948348Z

Recommended Posts

[Einführung in cx_Oracle] (17.) Datumsbehandlung
[Einführung in cx_Oracle] (5.) Umgang mit japanischen Daten
[Einführung in cx_Oracle] (8.) Version cx_Oracle 8.0
[Einführung in cx_Oracle] (Teil 7) Umgang mit Bindevariablen
[Einführung in cx_Oracle] Übersicht über cx_Oracle
Serie: Einführung in den Inhalt von cx_Oracle
[Einführung in cx_Oracle] (Teil 6) Zuordnung von DB- und Python-Datentypen
Trainieren! !! Einführung in Python Type (Type Hints)
[Einführung in die Udemy Python3 + -Anwendung] 28. Kollektiver Typ
[Einführung in die Udemy Python3 + -Anwendung] 21. Taple-Typ
[Einführung in die Udemy Python3 + -Anwendung] 65. Ausnahmebehandlung
[Einführung in die Udemy Python3 + -Anwendung] 24. Wörterbuchtyp
[Einführung in die Udemy Python3 + -Anwendung] 16. Listentyp
Einführung in MQTT (Einführung)
Einführung in Scrapy (1)
Einführung in Scrapy (3)
Erste Schritte mit Supervisor
Einführung in Tkinter 1: Einführung
[Cx_Oracle Primer] (Teil 3) Grundlagen zum Durchsuchen von Tabellen
Einführung in PyQt
Einführung in Scrapy (2)
[Linux] Einführung in Linux
[Einführung in cx_Oracle] (15.) Erstellen einer Ergebnismenge in einem anderen Format als tapple
Einführung in Scrapy (4)
Einführung in discord.py (2)
0 Konvertieren Sie nicht ausgefülltes Datum in Datums- / Uhrzeittyp mit regulärem Ausdruck
Setzen Sie DateField des Formulars in Django auf type = date
[Einführung in cx_Oracle] (Teil 11) Grundlagen der PL / SQL-Ausführung
Python> Datum / Uhrzeit> Von der Datumszeichenfolge (ISO-Format: 2015-12-09 12:40:08) zum Datum / Uhrzeit-Typ
[Einführung in cx_Oracle] (13.) Verbindung über Verbindungspool (Client-Seite)
Erste Schritte mit Web Scraping
Einführung in nichtparametrische Felder
Einführung in die Python-Sprache
Einführung in die TensorFlow-Bilderkennung
Einführung in OpenCV (Python) - (2)
Einführung in PyQt4 Teil 1
Einführung in die Abhängigkeitsinjektion
Einführung in Private Chainer
Einführung in das maschinelle Lernen
[Einführung in cx_Oracle] (Teil 4) Abrufen und Scrollen der Ergebnismenge