10
votes

Comment soustraire 2 dates dans Oracle pour obtenir le résultat par heure et minute

Je veux soustraire 2 dates et représenter le résultat par heure et minute dans une figure décimale.

J'ai le tableau suivant et je le fais de cette façon, mais le résultat n'est pas aussi souhaité. P>

Il y a une légère variation, je suis sûr que c'est simple arithmétique mais je ne comprends pas bien. P>

16:55- 14:00 = 2.55      
16:50-07:00 = 9.5      
16:30-7:20 = 9.1 and so on.    


3 commentaires

Le résultat attendu semble plutôt ridicule. Cela devrait être comme ça. 16: 55- 14:00 = 2:55 ou 2.92 16: 50-07: 00 = 9:50 ou 9.83 16: 30-7: 20 = 9:10 ou 9.17


Vais-je pouvoir l'obtenir sous la forme de 2,55. Je tiens réellement la durée et le calendrier et le calcul de la différend en heures et en minutes. Merci.


Je dois dire que c'est probablement l'une des questions SQL les plus écrites que j'ai vues sur le débordement de la pile. Je sais que vous avez probablement oublié cela, mais je devais le dire.


8 Réponses :


0
votes

Essayez ceci:

    SELECT
    TRIM(TO_CHAR(TRUNC(((86400*(end_time - start_time))/60)/60)-24*(trunc((((86400*(end_time - start_time))/60)/60)/24)),'00')) ||'.'||
    TRIM(TO_CHAR(TRUNC((86400*(end_time - start_time))/60)-60*(trunc(((86400*(end_time - start_time))/60)/60)),'00')) ||'.'  as duration
FROM come_leav;


4 commentaires

Merci pour votre aide, je reçois les résultats comme vous le souhaitez, mais je ne peux pas l'obtenir sans concaténation, je veux dire en tant que résultat final, car je dois l'utiliser pour calculer la différence de temps et de temps.


@Macky Si vous devez l'utiliser pour calculer des choses, les résultats de votre message d'origine sont corrects. 1h30 est une heure et une moitié moitié , une moitié est de 0,5, donc 1h30 = 1,5 heure.


Salut Roslan, tu as raison mais je veux que le calcul soit fait comme je l'ai demandé B'coz, je souhaite trouver la différence de temps entre le temps de début et l'heure de fin. Je souhaite donc le résultat demandé plus tôt I.E 16: 55-14: 00 à 2,55 et non 2.916667. Alors, veuillez indiquer un moyen plus simple de le faire merci ...


@Macky, j'ai édité le poteau ... remplacé le: séparateur avec a. et supprimé les secondes de la chaîne.



2
votes

Essayez ceci xxx


4 commentaires

Merci de votre aide. Mais le résultat n'est pas ce que je voulais. Voir ci-dessous SQL> Sélectionnez TO_Number (End_Time-Start_Time) * 24 de venu_leav; To_number (find_time-start_time) * 24 --------------------------------- 2.9166667 9.8333333 9.16666667 9.16666667 7.16666667 7.16666667


Je n'ai pas une base de données Oracle installée, donc je n'ai pu vérifier la requête que j'ai donnée. Désolé pour une réponse incorrecte / incomplète.


Il est précis dans le sens où il donne l'équivalent décimal des minutes - il suffit de multiplier cette partie de 60. Le problème est la nécessité étrange où l'OP avait besoin de cela comme hh.mm .


étage ((end_time - start_time) * 24) || '.' || Rond ((((end_time - start_time) * 24) - plancher ((end_time - start_time) * 24) * 60) est probablement comment l'OP aurait besoin de l'utiliser.



2
votes

Oracle représente des dates comme nombre de jours, donc (fin_time-start_time) * 24 code> vous donne des heures. Supposons que vous avez ce numéro (par exemple, 2.9166667 code>) dans la colonne h code>. Ensuite, vous pouvez facilement le convertir au format souhaité avec: plancher (H) + (plancher H) (H)) / 100 * 60 code>.

Exemple: P>

SELECT start_time, end_time,
    FLOOR((end_time-start_time)*24) + ((end_time-start_time)*24-FLOOR((end_time-start_time)*24))/100*60 AS hours_diff
FROM come_leav 


0 commentaires

-2
votes

Vous pouvez travailler avec l'extrait:

SELECT start_time, end_time, extract(HOUR FROM end_time-start_time) || '.' || extract(MINUTE FROM end_time-start_time)  
From come_leav;


2 commentaires

Je reçois l'erreur suivante: SQL> Sélectionnez Start_Time, End_Time, extrait (heure de fin_time-start_time) || '.' || extrait (minute de fin_time-start_time) de venu_leav; Sélectionnez Start_Time, End_Time, extrait (heure de fin_time-start_time) || '.' || extrait (minute à partir de find_time-start_time) à partir de get_leav * Erreur à la ligne 1: ORA-30076: champ d'extrait non valide pour extraire la source


@Roselan j'ai la même erreur que Macky. Aurait été formidable si cela fonctionnait ou pouvait être fait pour travailler.



4
votes
SQL> edit
Wrote file afiedt.buf

  1  select start_date
  2      , end_date
  3      , (24 * extract(day from (end_date - start_date) day(9) to second))
  4          + extract(hour from (end_date - start_date) day(9) to second)
  5          + ((1/100) * extract(minute from (end_date - start_date) day(9) to second)) as "HOUR.MINUTE"
  6* from t
SQL> /

START_DATE          END_DATE            HOUR.MINUTE
------------------- ------------------- -----------
21-06-2011 14:00:00 21-06-2011 16:55:00        2.55
21-06-2011 07:00:00 21-06-2011 16:50:00         9.5
21-06-2011 07:20:00 21-06-2011 16:30:00         9.1
It should be noted for those coming across this code that the decimal portions are ACTUAL minute differences, and not part of an hour. .5, therefore, represents 50 minutes, not 30 minutes.

3 commentaires

Vous trouverez ci-dessous le résultat quand je cours cela. Mais les pls ont un coup d'œil à la dernière ligne qui me donne 7,1 où, comme j'en ai besoin de 7,5 (14-6.50) sans la jeopariser d'autres chiffres. Appréciez votre aide START_TIME END_TIME heure.minute ------------------- ------------------- ---- 21-06-2011 14:00:00 21-06-2011 16:55:00 2.55 21-06-2011 07:00:00 21-06-2011 16:50:00 9.5 21-06-2011 07:20 : 00 21-06-2011 16:30:00 9.1 22-06-2011 07:20:00 22-06-2011 16:30:00 9.1 23-06-2011 07:20:00 23-06-2011 16 : 30: 00 9.1 21-06-2011 06:50:00 21-06-2011 14:00:00 7.1


@Macky. Ça n'a aucun sens. Vous avez demandé une soustraction du temps qui aboutirait à heures.minutes . (Qui n'a pas beaucoup de sens de commencer.) 14h00 moins 6:50 est de sept heures dix minutes ou 7.1. Êtes-vous en train de dire que vous voulez 2:00 - 1:59 pour être 0,41 pour une minute et 1:41 - 1:00 pour être 0,41 pendant quarante une minute?


@ShannonaSverance Très bon travail déchiffrant ce qu'il voulait et le code ci-dessus. En tant que note sur le code dans le poste, en raison de l'exigence étrange de l'OP, il convient de noter que la décimale représente les minutes réelles et non des parties fractionnaires d'une heure. J'ai soumis une modification.



0
votes

Edit: Si vous avez besoin d'un numéro,

    to_char(24*(trunc(end_date)-trunc(start_date))+to_number(to_char(end_date,'HH24.MI'))-to_number(to_char(start_date,'HH24.MI')),'99999.99')


4 commentaires

Sélectionnez Start_Time, End_time, to_char (Trunc (Sysdate) + (find_time-start_time), 'hh24.mi') de venu_leav; S_Time E_Time T_C 21-06-2011 14:00:00 21-06-2011 16:55:00 02.55 21-06-2011 07:00:00 21-06-2011 16:50:00 09.50 21-06-2011 07:20:00 21-06-2011 16:30:00 09.10 22-06-2011 07:20:00 22-06-06-2011 16:30:00 09.10 23-06-2011 07:20:00 23-06 -2011 16:30:00 09.10 21-06-2011 06:50:00 21-06-2011 14:00:00 07.10. Veuillez examiner le dernier résultat (14-06.50) renvoie 07.10 où je le souhaite comme (14-06.50) = 7.5. Toute suggestion comment surmonter cela .. Merci un million pour votre aide.


C'est ce que je reçois, semble avoir réparé le dernier mais les pls ont un coup d'œil au premier qu'il donne -88,45 au lieu de 2,55. Pls aidez-vous à bien réussir. Appréciez .. Start_Time End_time ---------- ------------------- TRONC (End_time-start_time) + to_char (to_number (to_char (find_tim e, 'Hh24.mi')) - to_num ber (to_char (start_ti ----------------------------------- ----------------------------------- 21-09-2011 14:00:00 21-06-2011 16:55:00 -88.45 21-06-2011 07:00:00 21-06-2011 16:50:00 9.5 23-06-2011 07:20:00 23-06-06-2011 16:30:00 9.1 21 -06-2011 06:50:00 21-06-2011 14:00:00 7.5


OK, a commis une erreur, 2.1 fonctionne maintenant comme votre volonté. Mais n'auriez-vous pas pu obtenir 2,55 car ils sont à différents mois et que la fin est plus petite que de commencer, il faut donc entraîner un grand nombre négatif. (Si vous retirez la partie 24 * (...) +, vous obtiendrez 2,55, mais vous ne devriez pas)


Salut @vmatyi, désolé. Oui, cette date est sur un mois différent. Il doit être le même mois ou je devrais dire que ce sera le même jour. Je trouve la différence en soustrayez le temps_out de Time_in pour entrer à Hr.min. Ceci est pour une donnée issue d'une machine à horloge de temps qui suit Emp in et Out et de signaler les heures de totement et des heures tardives. Je le fais de cette façon. Retour (TRUCON (: ET_TIME-: ST_TIME) + TO_CHAR (TO_NOMBER (TO_CHAR (: E T T_TIME, 'HH24.MI')) - to_Number (TO_CHAR (: st_time, 'hh24.mi'))), '9.99')) ;



0
votes

Cette requête est très utile pour moi et si un corps veulent diffrence entre start_date et end_date avec le temps comme HH: MI: SS Veuillez utiliser cette requête.

SELECT
    TRIM(TO_CHAR(TRUNC(((86400*(end_date - start_date))/60)/60)-24*(trunc((((86400(end_date - start_date))/60)/60)/24)),'00')) ||'.'||
    TRIM(TO_CHAR(TRUNC((86400*(actual_completion_date - actual_start_date))/60)-60*(trunc(((86400*(end_date - start_date))/60)/60)),'00')) ||'.'||
    TRIM(TO_CHAR(TRUNC((86400*(end_date - start_date)))-60*(trunc((86400*(end_date - actual_start_date))/60)),'00')) as duration  
FROM fnd_concurrent_requests; 


0 commentaires

0
votes

C'est une façon très laid de le faire, et cette première partie ne pose pas exactement la question de l'OP, mais cela donne un moyen d'obtenir des résultats en soustrayant 2 champs de date - dans mon cas, le créé_date et aujourd'hui représenté par sysdate : xxx

Il fournit la sortie sous x d'années, x mois, x jours, x heures, x minutes. Il pourrait être reformaté, mais vous aimez en changeant les chaînes concatérées.

Pour répondre à la question, je suis allé de l'avant et écrit comment obtenir les heures totales avec des minutes comme heures. : xxx


0 commentaires