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?
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.
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
à 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
UPDATE "TABLE"
SET DATE_FIELD = CURRENT_TIMESTAMP + interval '48' minute
WHERE (...)
Où interval
est un
- année
- mois
- jour
- heure
- MINUTE
- SECOND
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
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.
Peut-on pas utiliser ce
SELECT date_and_time + INTERVAL '20:00' MINUTE TO SECOND FROM dual;
je suis nouveau sur ce domaine.
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'
basé sur ce que vous demandez, vous voulez le format HH24:MI pour to_char.
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>
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....