[PYTHON] [Introduction à cx_Oracle] (17e) Gestion du type de date

Table de sérialisation

Série: Introduction à cx_Oracle Contents

Environnement de vérification

--Utilisation d'Oracle Cloud

Préparation préalable

Veuillez créer le tableau suivant.

sample17.sql


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

Traitement de base du type DATE

Comme expliqué dans 6th et 9th, type DATE Le type Python correspondant pour est datetime.datetime. Pour le type DATE, vous pouvez échanger avec DB normalement en le passant à datetime.datetime. En outre, datetime.datetime peut gérer des valeurs allant jusqu'à microsecondes, mais le type DATE ne peut gérer que des valeurs allant jusqu'à secondes, de sorte que les valeurs inférieures à secondes sont tronquées. Vous trouverez ci-dessous des exemples et des résultats d'exécution. J'obtiens la valeur qui a été avancée d'un jour au moment de SELECT afin que je puisse voir qu'elle se réfère à une valeur différente.

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("Valeur AP:", 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("Valeur DB:", val.strftime("%Y-%m-%d %H:%M:%S.%f"))

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

Manipulation de base de type TIMESTAMP

Comme le type DATE, le type TIMESTAMP prend également en charge le type Python datetime.datetime. Cependant, INSERT nécessite un codage supplémentaire par rapport au type DATE. Si le codage est le même que le type DATE, il sera traité de la même manière que le type DATE et les valeurs inférieures à une seconde seront tronquées. En ce moment,

  1. Utilisez la déclaration préparée
  2. Cursor.setinputsizes () spécifie que la variable de liaison correspondante a la taille de cx_Oracle.DB_TYPE_TIMESTAMP
  3. Exécutez SQL

Est requis. Vous trouverez ci-dessous des exemples et des résultats d'exécution. Notez que l'instruction SQL qui avance d'un jour utilise INTERVAL contrairement au type DATE car si elle est "+1", elle sera convertie en type DATE et les valeurs inférieures à secondes seront tronquées.

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("Valeur AP:", 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("Valeur DB:", val.strftime("%Y-%m-%d %H:%M:%S.%f"))
$ python sample17b.py
Valeur AP: 2020-09-26 23:51:27.832640
Valeur DB: 2020-09-27 23:51:27.832640

Manipulation de base du type TIMESTAMP WITH TIME ZONE et TIMESTAMP WITH LOCAL TIME ZONE type

Ces types de données peuvent être traités avec le même codage que le type TIMESTAMP. Définissez les types spécifiés par Cursor.setinputsizes () sur cx_Oracle.DB_TYPE_TIMESTAMP_TZ et cx_Oracle.DB_TYPE_TIMESTAMP_LTZ, respectivement. Cependant, au moment de l'écriture, il est possible de mettre à jour en définissant une date-heure d'acquisition au lieu de native, mais dans le cas de SELECT, les informations de fuseau horaire seront perdues car elles seront reçues à la date-heure native. Pour autant que je vérifie le manuel, malheureusement, il semble que même si j'utilise Curosr.var (), il n'y a pas de paramètre pour recevoir avec datetime conscient. Par conséquent, lorsque vous utilisez ces types de données, ne vous attendez pas à ce que cx_Oracle absorbe la différence de fuseau horaire et code avec Python ou SQL en tenant compte de la différence de fuseau horaire (calculez la différence de fuseau horaire par vous-même). Ou essayez de passer entre Python et SQL via une chaîne (par exemple format ISO 8601). Voici un exemple d'utilisation de la chaîne de date au format ISO 8601.

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("Valeur AP:", 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("Valeur DB:", val)
$ python sample17c.py
Valeur AP: 2020-09-27T07:05:42.948348+00:00
Valeur DB: 2020-09-28T07:05:42.948348Z

Recommended Posts

[Introduction à cx_Oracle] (17e) Gestion du type de date
[Introduction à cx_Oracle] (5e) Gestion des données japonaises
[Introduction à cx_Oracle] (8e) version de cx_Oracle 8.0
[Introduction à cx_Oracle] (Partie 7) Gestion des variables de liaison
[Introduction à cx_Oracle] Présentation de cx_Oracle
Série: Introduction à cx_Oracle Contents
[Introduction à cx_Oracle] (Partie 6) Mappage des types de données DB et Python
Entraine toi! !! Introduction au type Python (conseils de type)
[Introduction à l'application Udemy Python3 +] 28. Type collectif
[Introduction à l'application Udemy Python3 +] 21. Type Taple
[Introduction à l'application Udemy Python3 +] 65. Gestion des exceptions
[Introduction à l'application Udemy Python3 +] 24. Type de dictionnaire
[Introduction à l'application Udemy Python3 +] 16. Type de liste
Introduction à MQTT (Introduction)
Introduction à Scrapy (1)
Introduction à Scrapy (3)
Premiers pas avec Supervisor
Introduction à Tkinter 1: Introduction
[Cx_Oracle Primer] (Partie 3) Bases de la navigation dans les tableaux
Introduction à PyQt
Introduction à Scrapy (2)
[Linux] Introduction à Linux
[Introduction à cx_Oracle] (15e) Création d'un jeu de résultats dans un format autre que tapple
Introduction à Scrapy (4)
Introduction à discord.py (2)
0 Convertir une date non remplie en type datetime avec une expression régulière
Définissez DateField du formulaire sur type = date dans Django
[Introduction à cx_Oracle] (Partie 11) Bases de l'exécution PL / SQL
python> datetime> De la chaîne de date (format ISO: 2015-12-09 12:40:08) au type datetime
[Introduction à cx_Oracle] (13e) Connexion utilisant le pool de connexions (côté client)
Premiers pas avec le Web Scraping
Introduction aux baies non paramétriques
Introduction au langage Python
Introduction à la reconnaissance d'image TensorFlow
Introduction à OpenCV (python) - (2)
Introduction à PyQt4 Partie 1
Introduction à l'injection de dépendances
Introduction à Private Chainer
Introduction à l'apprentissage automatique
[Introduction à cx_Oracle] (Partie 4) Récupération et défilement du jeu de résultats