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?
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.
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
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
UPDATE "TABLE"
SET DATE_FIELD = CURRENT_TIMESTAMP + interval '48' minute
WHERE (...)
Où interval
est l'un des
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
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.
Ne pouvons-nous pas utiliser cela
SELECT date_and_time + INTERVAL '20:00' MINUTE TO SECOND FROM dual;
Je suis nouveau dans ce domaine.
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'
En fonction de ce que vous demandez, vous voulez le format HH24: MI pour to_char.
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>
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;