Oracle: comment ajouter des minutes à un horodatage?

je dois ajouter 30 minutes aux valeurs dans une colonne de date Oracle. Je le fais dans ma déclaration SELECT en spécifiant

to_char(date_and_time + (.000694 * 31)

qui fonctionne très bien la plupart du temps. Mais pas quand l'heure est à la frontière AM/PM. Par exemple, ajouter 30 minutes à 12:30[qui est PM] retourne 1:00 qui est AM. La réponse que j'attends est 13:00. Quelle est la manière correcte de le faire?

33
demandé sur Виталий Олегович 2008-11-02 23:34:31

11 réponses

toutes les autres réponses sont fondamentalement bonnes, mais je ne pense pas que quelqu'un ait répondu directement à votre question initiale.

en supposant que "date_and_time" dans votre exemple est une colonne avec type DATE ou TIMESTAMP, je pense que vous avez juste besoin de changer ceci:

to_char(date_and_time + (.000694 * 31))

à:

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

on dirait que votre format de date par défaut utilise le code " HH "Pour l'Heure, pas"HH24".

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

ceci éviterait les erreurs d'arrondi (à l'exception de celles inhérents à virgule flottante qui doit être vide de sens ici) et est plus clair, au moins pour moi.

28
répondu Dave Costa 2008-11-03 13:05:42

en plus de pouvoir ajouter un certain nombre de jours à une date, vous pouvez utiliser les types de données d'intervalle en supposant que vous êtes sur Oracle 9i ou plus tard, 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
108
répondu Justin Cave 2016-02-11 14:19:00

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

La pseudo-colonne SYSDATE affiche la date et l'heure du système en cours. L'ajout de 1 à SYSDATE fera avancer la date d'un jour. Utilisez les 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
répondu crazy 2010-02-22 13:14:26
UPDATE "TABLE" 
SET DATE_FIELD = CURRENT_TIMESTAMP + interval '48' minute 
WHERE (...)

interval est un

  • année
  • mois
  • jour
  • heure
  • MINUTE
  • SECOND
10
répondu jtomaszk 2013-06-11 08:22:50

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

e.g.

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

vous pouvez aussi 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 date valeur

Le dessus est également le standard SQL et travaille également dans plusieurs autres SGBD.

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

6
répondu a_horse_with_no_name 2016-11-07 07:22:15

Si le type de données du champ date ou timestamp, Oracle doit toujours donner le résultat correct si vous ajoutez le nombre correct en nombre de jours (ou de la bonne fraction de jour dans votre cas). Donc, si vous essayez de frapper la valeur en 30 minutes, vous devez utiliser :

select field + 0.5/24 from table;

D'après les renseignements que vous avez fournis, je crois que c'est ce que vous avez essayé de faire et je suis certain que cela fonctionne.

3
répondu Sidnei Andersson 2008-11-02 20:48:55

Peut-on pas utiliser ce

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

je suis nouveau sur ce domaine.

2
répondu saidevakumar 2016-11-07 07:15:49

assurez-vous Qu'Oracle comprenne que L'Heure de départ 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:'AM' dans le HH:MI est juste le paramètre pour l'indicateur de Méridien AM / PM. Pourrait aussi être 'PM'

1
répondu Camilo Díaz Repka 2008-11-02 20:47:57

basé sur ce que vous demandez, vous voulez le format HH24:MI pour to_char.

1
répondu Nathan Neulinger 2008-11-03 00:46:50

Pour modifier la 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
répondu Sam 2015-11-07 06:56:13
SELECT to_char(sysdate + (1/24/60) * 30, 'dd/mm/yy HH24:MI am') from dual;

Vous pouvez simplement l'utiliser avec différents formats de date....

-1
répondu Chirag Mehta 2012-01-11 05:39:25