IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Oracle Discussion :

Arrondir une date à cinq minutes


Sujet :

Oracle

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 45
    Points : 33
    Points
    33
    Par défaut Arrondir une date à cinq minutes
    Bonjour à tous,

    Je viens de me mettre au PL SQL et mes connaissances sont assez limitées, je cherche à arrondir une date aux 5 minutes inférieures :

    exemple 18h08min47s devient 18h05min00

    Donc pas de soucis avec l'algo : avec une date au format hh:mm:ss

    ss := 00
    mm := mm /(division entière) 5
    mm := mm*5

    un truc du genre devrait faire l'affaire.

    J'ai plusieurs soucis, j'arrive plus ou moins à extraire une partie d'une date, mais je ne sais pas insérer une partie d'une dans une date. En gros je ne sais pas modifier une date (ou une partie, les minutes par exemple).
    Je ne sais pas faire la division entière (est ce que '/' suffit ??).
    Mes dates sont à ce format : 01/08/12 00:00:00,000000000 ('DD/MM/YY HH:Mi:SS,FF9' ???).

    Et en plus de ça je ne peux pas faire de sortie écran avec DBMS_output, puisque la commande SET SERVEROUTPUT ON ne fonctionne pas (pour le moment j’espère) là où je travaille. C'est du coup pas très pratique pour tester ce que je fais...

    je vous montre ce que j'ai fait pour le moment :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    CREATE OR REPLACE FUNCTION TEST_ARRONDI_INF
    ( date_a_arrondir IN timestamp )
    RETURN timestamp
    IS
    date_retour timestamp; 
    minutes NUMBER;
     
    BEGIN
     
    minutes := EXTRACT(MINUTE FROM date_a_arrondir);
    minutes := minutes/5;
    minutes := minutes*5;
     
    RETURN date_retour;
    END;
    Je suis sûr que quelqu'un aura au moins un début de réponse à m'apporter, et je lui en serai très reconnaissant.

    Bonne journée à tous!

    Edit : j'utilise Oracle SQL developer 1.5.5
    version oracle 11g

  2. #2
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut
    Bonjour,

    Concernant l'arithmétique des dates, 1 heure = 1/24 et une minute = 1/24/60

    pour ajouter 5 minutes il faut donc ajouter à la date 5 * (1/24/60)

  3. #3
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Sqldev 1.5.5 !! récupère la dernière version (3.2) !!

    Récupère les secondes depuis le début de la journée ('SSSSS') et arrondi à 5 minutes (300 s), ensuite recrée la date en prenant le jour uniquement puis en rajoutant les secondes tronquées.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    WITH t AS (SELECT date_etat FROM MATABLE)
    SELECT date_etat, TRUNC(date_etat) + (300 * TRUNC(TO_NUMBER(TO_CHAR(date_etat, 'SSSSS') / 300))/24/3600) arrondi
    FROM t
    where rownum < 10
     
    DATE_ETAT			ARRONDI
    27/04/2007 16:33:39.597569	27/04/2007 16:30:00
    27/04/2007 16:33:39.724858	27/04/2007 16:30:00
    03/05/2007 10:33:07.997864	03/05/2007 10:30:00
    03/05/2007 13:51:07.065240	03/05/2007 13:50:00
    03/05/2007 13:51:29.613017	03/05/2007 13:50:00
    03/05/2007 13:54:49.836573	03/05/2007 13:50:00
    03/05/2007 13:55:06.407456	03/05/2007 13:55:00
    03/05/2007 13:56:10.679470	03/05/2007 13:55:00
    03/05/2007 13:56:51.380685	03/05/2007 13:55:00

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 45
    Points : 33
    Points
    33
    Par défaut
    Merci de vos réponses si rapides !!

    @ SheikYerbouti : je suis d'accord sur le principe, mais le but n'est pas d'ajouter 5 minutes mais d'arrondir à 5 minutes ex 18h37 --> 18h35.

    @ McM : ta solution m'a l'air de faire ce que je veux, j'essaye de l'adapter à mon cas et je vous tiens au courant.

    Encore merci !

    Edit : je viens de tester ta solution McM, ça ne fonctionne pas sur mon cas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    WITH t AS (SELECT date_start FROM sws_data_set)
    SELECT date_start, TRUNC(date_start) + (300 * TRUNC(TO_NUMBER(TO_CHAR(date_start, 'SSSSS') / 300))/24/3600) arrondi
    FROM t
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    DATE_START                ARRONDI                   
    ------------------------- ------------------------- 
    02/08/12 00:00:00,000000000 02/08/12                  
    02/08/12 00:00:00,000000000 02/08/12                  
    24/09/12 09:58:27,000000000 24/09/12                  
    01/08/12 00:00:00,000000000 01/08/12                  
    01/08/12 00:00:00,000000000 01/08/12                  
    01/08/12 00:00:00,000000000 01/08/12                  
    02/08/12 00:00:00,000000000 02/08/12                  
     
    7 rows selected

    Pour SQLdev 1.5.5, j'ai pas le choix, je ne peux pas installer ce que je veux ... (j'ai pu installer firefox à la place de ie6 ... c'est déjà pas mal!)


    EDIT 2 :

    J'ai l'impression que c'est le :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    + (300 * TRUNC(TO_NUMBER(TO_CHAR(date_start, 'SSSSS') / 300))/24/3600)
    qui ne passe pas, parce que quand je retire le :

    qui est devant, j'ai l'erreur suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Erreur commençant à la ligne 1 de la commande :
    WITH t AS (SELECT date_start FROM sws_data_set)
    SELECT date_start,300 * TRUNC(TO_NUMBER(TO_CHAR(date_start, 'SSSSS') / 300))/24/3600) arrondi
    FROM t
    Erreur à la ligne de commande : 2, colonne : 84
    Rapport d'erreur :
    Erreur SQL : ORA-00923: mot-clé FROM absent à l'emplacement prévu
    00923. 00000 -  "FROM keyword not found where expected"

  5. #5
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    C'est juste le format de ta date je pense (sous sqldev).
    Essaye de faire un to_char de tout avec les HH24:MI:SS)

  6. #6
    Membre régulier
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2011
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2011
    Messages : 52
    Points : 116
    Points
    116
    Par défaut
    C'est juste le format de la ligne qu'il faut que tu ré écrives :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    SQL> select to_char(sysdate,'DD-MM-YYYY HH24:MI:SS') from dual;
     
    TO_CHAR(SYSDATE,'DD
    -------------------
    24-09-2012 17:16:08
     
    SQL> SELECT to_char(TRUNC(sysdate) + (300 * TRUNC(TO_NUMBER(TO_CHAR(sysdate, 'SSSSS') / 300))/24/3600), 'DD-MM-YYYY HH24:MI:SS') from dual;
     
    TO_CHAR(TRUNC(SYSDA
    -------------------
    24-09-2012 17:15:00

  7. #7
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    @funoracle : Tu peux supprimer la citation de ton post qui ne sert à rien ?

    @kokomaniak : Ton problème d'erreur quand tu retires le trunc(date_etat), c'est que tu as aussi supprimé la première (

    Sinon le fait qu'il n'y ait pas les heures, je précise que c'est un problème d'affichage de date sous sqldev (parce que le retour n'est plus un timestamp, mais une DATE). Regarde dans le paramétrage le format d'affichage des dates par défaut.

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 45
    Points : 33
    Points
    33
    Par défaut
    Merci McM, j'ai testé les deux solutions que tu m'as données, et ça fonctionne parfaitement. A la fois le to_char(...,'DD-MM-YY HH24:MI:SS'), que la modification du format par défaut de date.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Ajouter cinq minutes à une date
    Par Moostiq dans le forum SQL
    Réponses: 2
    Dernier message: 03/01/2012, 15h08
  2. convertir une date en minutes
    Par amirad dans le forum VB.NET
    Réponses: 6
    Dernier message: 04/11/2009, 17h49
  3. extraction minute a partir d'une date
    Par habasque dans le forum Oracle
    Réponses: 2
    Dernier message: 14/11/2006, 11h00
  4. [XSLT] Comment ajouter 1 minute ou 1 jour à une date
    Par crazzino dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 09/07/2006, 12h19
  5. Fixer l'heure, les minutes et les secondes d'une date
    Par pyxosledisciple dans le forum Access
    Réponses: 2
    Dernier message: 22/02/2006, 08h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo