Comment insérer un horodatage dans Oracle?

Réponses:

135
insert
into tablename (timestamp_value)
values (TO_TIMESTAMP(:ts_val, 'YYYY-MM-DD HH24:MI:SS'));

si vous voulez que l'horodatage actuel soit inséré, alors:

insert
into tablename (timestamp_value)
values (CURRENT_TIMESTAMP);
Reggie
la source
1
Pourquoi TO_DATEau lieu de TO_TIMESTAMP?
Dave Costa
Cela n'a pas d'importance pour cette simple INSERTinstruction, mais en général, vous ne voulez pas utiliser de variables de liaison comme celle-ci. La conversion de type dans votre première instruction l'empêche d'être sensible à la liaison, ce qui limite la capacité d'Oracle à créer de bons plans. L'optimiseur peut fonctionner mieux si vous l'utilisez à la values (:ts_val)place, en supposant que: ts_val mappe directement sur un horodatage.
Jon Heller
@JonHeller Pouvez-vous montrer un exemple spécifique de la façon dont l'utilisation to_timestampentraînerait un mauvais plan d'exécution pour une instruction SQL planifiable? Je peux montrer un exemple de la façon dont ce ne serait pas le cas. Au lieu de cela, je pense que nous voulons tous éviter une contrainte de type de données inattendue qui empêche l'utilisation d'une opération de source de ligne attendue (c'est-à-dire, celle optimale).
Jeff Holt
@ jeff6times7 Voir ce Gist pour une explication de la façon dont les variables de liaison non converties peuvent surpasser les variables de liaison converties. La différence n'a probablement d'importance que si les données sont biaisées. Avec les types de liaison natifs, Oracle peut mieux comprendre les données et effectuer de meilleures estimations en fonction des valeurs.
Jon Heller
24
INSERT
INTO    mytable (timestamp_field)
VALUES  (CURRENT_TIMESTAMP)

CURRENT_TIMESTAMPet SYSTIMESTAMPsont des mots réservés à Oracle à cet effet. Ils sont l'analogue d'horodatage de SYSDATE.

Quassnoi
la source
19
INSERT INTO TABLE_NAME (TIMESTAMP_VALUE) VALUES (TO_TIMESTAMP('2014-07-02 06:14:00.742000000', 'YYYY-MM-DD HH24:MI:SS.FF'));
Kash
la source
9

Cela dépend de l'origine de la valeur que vous souhaitez insérer. Si vous souhaitez insérer l'heure actuelle, vous pouvez l'utiliser CURRENT_TIMESTAMPcomme indiqué dans d'autres réponses (ou SYSTIMESTAMP).

Si vous avez une heure sous forme de chaîne et que vous souhaitez la convertir en horodatage, utilisez une expression telle que

to_timestamp(:timestamp_as_string,'MM/DD/YYYY HH24:MI:SS.FF3')

Les composants du format de l'heure sont, je l'espère, explicites, sauf que FF3 signifie 3 chiffres de précision inférieure à la seconde. Vous pouvez aller jusqu'à 6 chiffres de précision.

Si vous effectuez une insertion depuis une application, la meilleure réponse peut dépendre de la manière dont la valeur de date / heure est stockée dans votre langue. Par exemple, vous pouvez mapper certains objets Java directement sur une TIMESTAMPcolonne, mais vous devez comprendre les JDBCmappages de types.

Dave Costa
la source
4

Je préfère les littéraux d'horodatage ANSI:

insert into the_table 
  (the_timestamp_column)
values 
  (timestamp '2017-10-12 21:22:23');

Plus de détails dans le manuel: https://docs.oracle.com/database/121/SQLRF/sql_elements003.htm#SQLRF51062

un cheval sans nom
la source
Oracle 11. Champ défini comme TIMESTAMP (6) non NULL. En utilisant timestamp '2019-05-16 10:05:51:19:277401'j'ai cette erreur: ORA-01882: région du fuseau horaire introuvable
Alex 75
1

Insertion de la date dans SQL

insert
into tablename (timestamp_value)
values ('dd-mm-yyyy hh-mm-ss AM');

Si nous voulons insérer la date système

insert
into tablename (timestamp_value)
values (sysdate);
Sai Krishna
la source
0

Tout d'abord, vous devez rendre le champ Nullable, puis après cela si simple - au lieu de mettre une valeur, mettez ce code CURRENT_TIMESTAMP.

Ahuramazda
la source
0

Pour ma propre référence future:

Avec cx_Oracle, utilisez cursor.setinputsize (...):

mycursor = connection.cursor();

mycursor.setinputsize( mytimestamp=cx_Oracle.TIMESTAMP );
params = { 'mytimestamp': timestampVar };
cusrsor.execute("INSERT INTO mytable (timestamp_field9 VALUES(:mytimestamp)", params);

Aucune conversion nécessaire dans la base de données. Voir la documentation Oracle

Mario la cuillère
la source
0

On peut simplement utiliser

INSERT INTO MY_TABLE(MY_TIMESTAMP_FIELD)
VALUES (TIMESTAMP '2019-02-15 13:22:11.871+02:00');

De cette façon, vous n'aurez pas à vous soucier de la chaîne de format de date, utilisez simplement le format d'horodatage par défaut.

Fonctionne avec Oracle 11, je ne sais pas si c'est le cas pour les versions antérieures d'Oracle.

Autre
la source
-6
CREATE TABLE Table1 (
id int identity(1, 1) NOT NULL,
Somecolmn varchar (5),
LastChanged [timestamp] NOT NULL)

cela fonctionne pour mssql 2012

INSERT INTO Table1 VALUES('hello',DEFAULT)  
VGuest
la source