web-dev-qa-db-fra.com

Oracle: comment ajouter des minutes à un horodatage?

J'ai besoin d'ajouter 30 minutes aux valeurs d'une colonne de date Oracle. Je le fais dans mon instruction SELECT en spécifiant

to_char(date_and_time + (.000694 * 31)

qui fonctionne bien la plupart du temps. Mais pas quand l'heure est à la frontière AM/PM. Par exemple, l'ajout de 30 minutes à 12:30 [qui est PM] renvoie 1:00, qui correspond à AM. La réponse que j'attends est 13:00. Quelle est la bonne façon de faire cela?

34
Sajee

Toutes les autres réponses sont fondamentalement correctes, mais je ne pense pas que quiconque ait directement répondu à votre question initiale.

En supposant que "date_and_time" dans votre exemple soit une colonne de type DATE ou TIMESTAMP, je pense que vous devez simplement changer ceci:

to_char(date_and_time + (.000694 * 31))

pour ça:

to_char(date_and_time + (.000694 * 31), 'DD-MON-YYYY HH24:MI')

Il semble que votre format de date par défaut utilise le code "HH" pour l'heure, pas "HH24".

En outre, je pense que votre terme constant est à la fois confus et imprécis. Je suppose que ce que vous avez fait est de calculer que (.000694) correspond à la valeur d’une minute et que vous la multipliez par le nombre de minutes que vous souhaitez ajouter (31 dans l’exemple, bien que vous ayez dit 30 dans le texte).

Je voudrais aussi commencer par un jour et le diviser en unités que vous voulez dans votre code. Dans ce cas, (1/48) correspond à 30 minutes; ou si vous voulez le diviser pour plus de clarté, vous pouvez écrire ((1/24) * (1/2)).

Cela éviterait les erreurs d'arrondi (à l'exception de celles inhérentes à la virgule flottante qui devrait être sans signification ici) et est plus clair, du moins pour moi.

28
Dave Costa

En plus de pouvoir ajouter un nombre de jours à une date, vous pouvez utiliser des types de données d'intervalle en supposant que vous êtes sur Oracle 9i ou plus tard, ce qui peut être un peu plus facile à lire,

SQL> ed
Wrote file afiedt.buf
SELECT sysdate, sysdate + interval '30' minute FROM dual
SQL> /

SYSDATE              SYSDATE+INTERVAL'30'
-------------------- --------------------
02-NOV-2008 16:21:40 02-NOV-2008 16:51:40
110
Justin Cave

de http://www.orafaq.com/faq/how_does_one_add_a_day_hour_minute_second_to_a_date_value

La pseudo-colonne SYSDATE indique la date et l'heure actuelles du système. Si vous ajoutez 1 à SYSDATE, la date sera avancée d’un jour. Utilisez des fractions pour ajouter des heures, des minutes ou des secondes à la date

SQL> select sysdate, sysdate+1/24, sysdate +1/1440, sysdate + 1/86400 from dual;

SYSDATE              SYSDATE+1/24         SYSDATE+1/1440       SYSDATE+1/86400
-------------------- -------------------- -------------------- --------------------
03-Jul-2002 08:32:12 03-Jul-2002 09:32:12 03-Jul-2002 08:33:12 03-Jul-2002 08:32:13
11
crazy
UPDATE "TABLE" 
SET DATE_FIELD = CURRENT_TIMESTAMP + interval '48' minute 
WHERE (...)

interval est l'un des 

  • ANNÉE
  • MOIS
  • JOURNÉE
  • HEURE
  • MINUTE
  • SECONDE
10
jtomaszk

Je préfère utiliser un littéral interval pour cela, parce que interval '30' minute ou interval '5' second est beaucoup plus facile à lire que 30 / (24 * 60) ou 5 / (24 * 60 * 69) 

par exemple. 

  • some_date + interval '2' hour
  • some_date + interval '30' minute
  • some_date + interval '5' second
  • some_date + interval '2' day

Vous pouvez également combiner plusieurs unités en une seule expression:

  • some_date + interval '2 3:06' day to minute 

Ajoute 2 jours, 3 heures et 6 minutes à la valeur de la date

Ce qui précède est également un langage SQL standard et fonctionne également dans plusieurs autres SGBD. 

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

7

Si le type de données du champ est date ou horodatage, Oracle doit toujours donner le résultat correct si vous ajoutez le nombre correct indiqué en nombre de jours (ou la fraction de journée correcte dans votre cas). Donc, si vous essayez de modifier la valeur en 30 minutes, vous devez utiliser: 

select field + 0.5/24 from table;

D'après les informations que vous avez fournies, je pense que c'est ce que vous avez essayé de faire et je suis tout à fait sûr que cela fonctionne.

3
Sidnei Andersson

Ne pouvons-nous pas utiliser cela

SELECT date_and_time + INTERVAL '20:00' MINUTE TO SECOND FROM dual;

Je suis nouveau dans ce domaine.

2
saidevakumar

Assurez-vous qu'Oracle comprend que l'heure de début est PM et spécifiez le masque de format HH24 pour la sortie finale.

SELECT to_char((to_date('12:40 PM', 'HH:MI AM') + (1/24/60) * 30), 'HH24:MI') as time
  FROM dual

TIME
---------
13:10

Remarque: le 'AM' dans HH: MI n’est autre que l’espace réservé pour le méridien AM/PM. Pourrait aussi être 'PM'

1

En fonction de ce que vous demandez, vous voulez le format HH24: MI pour to_char. 

1
Nathan Neulinger

Pour modifier Date dans Oracle, vous pouvez essayer 

  select to_char(<columnName> + 5 / 24 + 30 / (24 * 60),
           'DD/MM/RRRR hh:mi AM') AS <logicalName> from <tableName>
0
Sam

comme ça très facilement

j'ai ajouté 10 minutes à la date du système et j'utilise toujours de préférence les fonctions du serveur DB non personnalisées.

select to_char(sysdate + NUMTODSINTERVAL(10,'MINUTE'),'DD/MM/YYYY HH24:MI:SS') from dual;
0
Bilal