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

SQL Oracle Discussion :

interval entre des dates


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 84
    Par défaut interval entre des dates
    Y-a-t-il un moyen de transformer un réel (qui represente un nombre de jours, par exemple 0,0791435185185185) dans un interval temporel, format HH:MM:SS ?

    Je ne suis pas le seul à me poser cette question sans avoir trouvé de réponse.

    Pourquoi cette question? Parce que si on veut l'interval entre 2 dates en sql on fait (par exemple):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select
    to_date('2008-01-22 15:28:08','YYYY-MM-DD HH24:MI:SS') - 
    to_date('2008-01-22 13:34:10','YYYY-MM-DD HH24:MI:SS')
    from dual
    0,0791435185185185
    et ça donne exactement le réel mentionné plus haut, ç'est à dire le nombre de jours (avec virgule).

    Alors je me suis mis comme défi ce problème, ç'est à dire d'avoir le résultat dans le format HH:MM:SS, et comme j'y ai passé la matinée, autant en faire profiter tout le monde. Voilà donc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    -- calcule (date1 - date2); format des dates à l'entrée = &3
    -- (par exemple &3 = YYYY-MM-DD HH24:MI:SS)
    select
    TRUNC(24 *             (to_date('&1','&3') - to_date('&2','&3')))||':'||
    TRUNC(60 * (24 *       (to_date('&1','&3') - to_date('&2','&3')) -
    TRUNC(24 *             (to_date('&1','&3') - to_date('&2','&3')))))||':'||
    ROUND(60 * (60 * (24 * (to_date('&1','&3') - to_date('&2','&3')) -
    TRUNC(24 *             (to_date('&1','&3') - to_date('&2','&3')))) -
    TRUNC(60 * (24 *       (to_date('&1','&3') - to_date('&2','&3')) -
    TRUNC(24 *             (to_date('&1','&3') - to_date('&2','&3')))))))
    as "HH:MM:SS" from dual
    ;
    Pour utiliser ça au mieux, on peut en faire un fichier "datediff.sql" et si on est sous UNIX faire un autre fichier "datediff.sh" comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    conexion=$1 ; shift
    sql_file=$1 ; shift
    date1=$1 ; date2=$2 ; format=$3
    #echo "Connexion: $conexion"
      sqlplus -s $conexion << EOF
      set pagesize 0
      set newpage 0
      set heading off
      set verify off
      set feedback off
      @$sql_file "$date1" "$date2" "$format";
    EOF
    Sous UNIX on peut maintenant faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    > CONNEXION="USER@NOM_BASE/PASSWORD"   # (à remplacer fonction de votre site)
    > export DIROUTILS="/home/user/outils"   # (à remplacer fonction de votre site)
    > alias datediff="$DIROUTILS/datediff.sh $CONNEXION $DIROUTILS/datediff.sql"
    >
    > d1="2008-01-22 15:28:08"
    > d2="2008-01-22 13:34:10"
    > f="YYYY-MM-DD HH24:MI:SS"
    >
    > datediff "$d1" "$d2" "$f"          # (guillimets obligatoires!)
    1:53:58
    ou
    > datediff "2008-01-22 15:28:08" "2008-01-22 13:34:10" "YYYY-MM-DD HH24:MI:SS"
    1:53:58
    Tout est testé (Oracle9i) et vérifié, ça marche meme si les dates sont inversées ou si on met 2009 à la place de 2008 pour une des dates. Essayez pour voir ce que ça donne! Ca tient meme compte du fait que 2008 est bisextil (février 2008 a 29 jours)(par l'intermède de l'opérateur "-" de sql).

    Et alors que j'avais entendu quelcun dire qu'en UNIX il n'y a pas de fonctions pour les dates!!!!(). Sans plaisenter, en fait tout ce qu'on peut faire sous sql on pourra faire sous UNIX, pourvu qu'on a sqlplus sur la station.
    a+

    sinon, y-a-t-il qq qui connait le format sql pour le millisecondes ? (du genre "YYYY-MM-DD HH24:MI:SS.MS") ?

  2. #2
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    SQL> select (date '2009-01-01' - sysdate) day (4) to second from dual
     
    (DATE'2009-01-01'-SYSDATE)DAY(4)TOSECOND          
    --------------------------------------------------
    +330 07:14:57.000000                              
     
     
    1 row selected.
    SQL> select (date '2009-01-01' - current_timestamp) day (4) to second from dual
     
    (DATE'2009-01-01'-CURRENT_TIMESTAMP)DAY(4)TOSECOND
    --------------------------------------------------
    +330 07:14:56.680602

  3. #3
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SQL> select numtodsinterval(.0791435185185185, 'DAY') from dual
     
    NUMTODSINTERVAL(.0791435185185185,'DAY')          
    --------------------------------------------------
    +00 01:53:57.999999

  4. #4
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Par défaut
    bien sûr dans unix une ligne suffit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    echo .0791435185185185|
    awk '{h=$1*24;m=h%1*60;s=m%1*60+.5;printf("%0d:%02d:%02d\n",h,m,s)}'
    1:53:58

  5. #5
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par vpovpo Voir le message
    Pour utiliser ça au mieux, on peut en faire un fichier "datediff.sql" et si on est sous UNIX faire un autre fichier "datediff.sh"
    Pourquoi ne pas utiliser une fonction stockée en base ?
    C'est l'usine à gaz ton truc.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 84
    Par défaut
    CA OUI, JE PRENDS - pour les 3 solutions offertes par laurentschneider.

    OBS.: awk il faut bien le connaitre, ç'est vrai qu'on peut faire plein de choses avec.

    a+

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

Discussions similaires

  1. Moyenne d’écart entre des dates
    Par yacine.dev dans le forum SSIS
    Réponses: 3
    Dernier message: 09/07/2013, 13h21
  2. Interval entre deux dates
    Par napalm45 dans le forum 4D
    Réponses: 1
    Dernier message: 26/04/2008, 12h08
  3. Réponses: 7
    Dernier message: 22/06/2007, 14h38
  4. [Access2003/SQLserver2000]Comparaison entre des dates (champs texte)
    Par hoaxpunk dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 09/06/2007, 13h21
  5. Réponses: 3
    Dernier message: 27/01/2006, 12h36

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