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

Langage SQL Discussion :

Travailler sur une date


Sujet :

Langage SQL

  1. #1
    HqX
    HqX est déconnecté
    Futur Membre du Club
    Inscrit en
    Octobre 2004
    Messages
    9
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9
    Points : 7
    Points
    7
    Par défaut Travailler sur une date
    Bonjour tout le monde

    J'ai un problème avec une colonne de type date. Elle est de la forme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    CREATEDON
    2003-04-17 12:01:26
    Mon problème est que je voudrais effectuer des requêtes en travaillant uniquement sur le jour, le mois et l'année de cette date. Je n'ai pas la possibilité de modifier la base de données car elle est éditée par un programme spécifique.
    J'ai connaissance de la fonction EXTRACT mais est-il possible d'extraire plusieurs parties d'une date ? Je n'arrive à extraire seulement qu'une partie (jour, mois OU année).

    Ma requête devra consister à trouver les lignes se trouvant entre deux dates (utilisation de la fonction BETWEEN donc) entre autres conditions mais c'est la seule qui me pose souci.

    Merci de votre aide

  2. #2
    Membre confirmé
    Avatar de Higgins
    Inscrit en
    Juillet 2002
    Messages
    520
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 520
    Points : 543
    Points
    543
    Par défaut
    DATE( expression ) Converts the expression into a date, and removes any hours, minutes or seconds. Conversion errors may be reported.

    DATEFORMAT( date-expr, string-expr ) Returns a string representing the date date-expr in the format specified by string-expr. Any allowable date format can be used for string-expr.

    For example,

    DATEFORMAT('1989-01-01', 'Mmm Dd, yyyy')

    is

    'Jan 1, 1989'

    Year 2000 compliance—It is possible in using the DATEFORMAT function to produce a string with the year value represented by only two digits. This can cause problems with year 2000 compliance even though no error has occurred.
    For more information on year 2000 compliance, please see "Date to string conversions".

    For more information, see the DATE_FORMAT option in "SET OPTION statement".

    DATENAME ( datepart, date ) Returns the name of the specified part (such as the month "June") of a DATETIME value, as a character string. If the result is numeric, such as 23 for the day, it is still returned as a character string. For example, the following statement displays the value May.

    SELECT datename( month , '1987/05/02' )

    DATETIME( expression ) Converts the expression into a timestamp. Conversion errors may be reported.

    DAY( date-expr ) Returns a number from 1 to 31 corresponding to the day of the given date.

    DAYNAME( date-expr ) Returns the name of the day from the supplied date expression. For example, with the date_order option set to the default value of ymd:

    SELECT DAYNAME ('1987/05/02')

    returns the value Saturday.

    DAYS( datetime-expr ) Return the number of days since an arbitrary starting date.

    DAYS( date-expr, date-expr ) Returns the number of days from the first date to the second date. The number may be negative. Hours, minutes and seconds are ignored.

    DAYS( date-expr, integer-expr ) Add integer-expr days to the given date. If the integer-expr is negative, the appropriate number of days are subtracted from the date. Hours, minutes and seconds are ignored.

    DOW( date-expr ) Returns a number from 1 to 7 representing the day of the week of the given date, with Sunday=1, Monday=2, and so on.

    HOUR( datetime-expr ) Returns a number from 0 to 23 corresponding to the hour component of the given date.

    HOURS( datetime-expr ) Return the number of hours since an arbitrary starting date and time.

    HOURS( datetime-expr, datetime-expr ) Returns the number of whole hours from the first date/time to the second date/time. The number may be negative.

    HOURS( datetime-expr, integer-expr ) Add integer-expr hours to the given date/time. If the integer-expr is negative, the appropriate number of hours are subtracted from the date/time.

    MINUTE( datetime-expr ) Returns a number from 0 to 59 corresponding to the minute component of the given date/time.

    MINUTES( datetime-expr ) Return the number of minutes since an arbitrary starting date and time.

    MINUTES( datetime-expr, datetime-expr ) Returns the number of whole minutes from the first date/time to the second date/time. The number may be negative.

    MINUTES( datetime-expr, integer-expr ) Add integer-expr minutes to the given date/time. If the integer-expr is negative, the appropriate number of minutes are subtracted from the date/time.

    MONTH( date-expr ) Returns a number from 1 to 12 corresponding to the month of the given date.

    MONTHNAME( date-expr ) Returns the name of the month from the supplied date expression. For example, with the date_order option set to the default value of ymd:

    SELECT MONTHNAME ('1987/05/02')

    returns the value May.

    MONTHS( datetime-expr ) Return the number of months since an arbitrary starting date. This number is often useful for determining if two date/time expressions are on the same month in the same year.

    MONTHS( invoice_sent ) = MONTHS( payment_received )

    Note that comparing the MONTH function would be wrong if a payment were made 12 months after the invoice was sent.

    MONTHS( date-expr, date-expr ) Returns the number of whole months from the first date to the second date. The number may be negative. Hours, minutes and seconds are ignored.

    MONTHS( date-expr, integer-expr ) Add integer-expr months to the given date. If the new date is past the end of the month (such as MONTHS('1992-01-31', 1) ) the result is set to the last day of the month. If the integer-expr is negative, the appropriate number of months are subtracted from the date. Hours, minutes and seconds are ignored.

    NOW( * ) Returns the current date and time. This is the historical syntax for CURRENT TIMESTAMP.

    QUARTER( date-expr ) Returns the quarter from the supplied date expression. For example, with the date_order option set to the default value of ymd:

    SELECT QUARTER ('1987/05/02')

    returns the value 2.

    SECOND( datetime-expr ) Returns a number from 0 to 59 corresponding to the second component of the given date.

    SECONDS( datetime-expr ) Return the number of seconds since an arbitrary starting date and time.

    SECONDS( datetime-expr, datetime-expr ) Returns the number of whole seconds from the first date/time to the second date/time. The number may be negative.

    SECONDS( datetime-expr, integer-expr ) Add integer-expr seconds to the given date/time. If the integer-expr is negative, the appropriate number of seconds are subtracted from the date/time.

    TODAY( * ) Returns today's date. This is the historical syntax for CURRENT DATE.

    WEEKS( datetime-expr ) Return the number of weeks since an arbitrary starting date. (Weeks are defined as going from Sunday to Saturday, as they do in a North American calendar.) This number is often useful for determining if two dates are in the same week.

    WEEKS( invoice_sent ) = WEEKS( payment_received )

    WEEKS( date-expr, date-expr ) Returns the number of whole weeks from the first date to the second date. The number may be negative. Hours, minutes and seconds are ignored.

    WEEKS( date-expr, integer-expr ) Add integer-expr weeks to the given date. If the integer-expr is negative, the appropriate number of weeks are subtracted from the date. Hours, minutes and seconds are ignored.

    YEAR( date-expr ) Returns a 4 digit number corresponding to the year of the given date.

    YEARS( date-expr ) Same as the YEAR function.

    YEARS( date-expr, date-expr ) Returns the number of whole years from the first date to the second date. The number may be negative. Hours, minutes and seconds are ignored. For example, age can be calculated by

    YEARS( birthdate, CURRENT DATE )

    YEARS( date-expr, integer-expr ) Add integer-expr years to the given date. If the new date is past the end of the month (such as YEARS( '1992-02-29', 1 ) ) the result is set to the last day of the month. If the integer-expr is negative, the appropriate number of years are subtracted from the date. Hours, minutes, and seconds are ignored.

    YMD( year-num, month-num, day-num ) Returns a date value corresponding to the given year, month, and day of the month. If the month is outside the range 1-12, the year is adjusted accordingly. Similarly, the day is allowed to be any integer: the date is adjusted accordingly. For example,

    YMD( 1992, 15, 1 ) = 'Mar 1 1993'

    YMD( 1992, 15, 1-1 ) = 'Feb 28 1993'

    YMD( 1992, 3, 1-1 ) = 'Feb 29 1992'
    [/code]
    7 fois à terre, 8 fois debout

  3. #3
    HqX
    HqX est déconnecté
    Futur Membre du Club
    Inscrit en
    Octobre 2004
    Messages
    9
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9
    Points : 7
    Points
    7
    Par défaut
    Ca permet de travailler sur une variable le DATEFORMAT mais pas sur une colonne ?

    J'ai beau essayé avec tous les fonctions que je trouve(TRUNC), DBvisualizer me renvoie :

    ORA-00904 Nom de colonne nom valide

    Voici la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    and DATEFORMAT(PDM.PDM_PRODUCTITEM.CREATEDON,'dd/MM/YYYY') = 10/12/2003
    J'essaie d'abord de faire un égal avant le between.

  4. #4
    Membre habitué Avatar de nantais
    Inscrit en
    Juillet 2004
    Messages
    158
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 158
    Points : 192
    Points
    192
    Par défaut
    Ton code serait plutôt de la sorte :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    and to_char(PDM.PDM_PRODUCTITEM.CREATEDON,'dd/MM/YYYY') = '10/12/2003'

  5. #5
    HqX
    HqX est déconnecté
    Futur Membre du Club
    Inscrit en
    Octobre 2004
    Messages
    9
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9
    Points : 7
    Points
    7
    Par défaut
    Ca marche pour tester une égalité mais je veux comparer 2 dates et pas 2 chaînes de caractères

    Je veux faire un between c'était marqué dans mon précédent post mais merci quand même pour ton aide.

  6. #6
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    1°) ça aurait été plus judicieux de poster dans le forum Oracle et au moins de donner le SGBD

    2°)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    and TO_DATE(PDM.PDM_PRODUCTITEM.CREATEDON,'dd/MM/YYYY') = '10/12/2003'
    dateformat n'existe pas sous Oracle

  7. #7
    HqX
    HqX est déconnecté
    Futur Membre du Club
    Inscrit en
    Octobre 2004
    Messages
    9
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9
    Points : 7
    Points
    7
    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
     
    DbVisualizer  4.1.1
    Java VM:  Java HotSpot(TM) Client VM
    Java Version:  1.5.0-b64
    Java Vendor:  Sun Microsystems Inc.
    OS Name:  Windows XP
    OS Arch:  x86
    OS Version:  5.1
     
    Oracle
    Oracle8i Enterprise Edition Release 8.1.7.4.1 - Production
    JServer Release 8.1.7.4.1 - Production
    Oracle JDBC driver
    8.1.7.0.0
    Désolé d'avoir mal placé mon message


    Avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    and TO_CHAR(PDM.PDM_PRODUCTITEM.CREATEDON,'dd/MM/YYYY') = '10/12/2003'
    J'obtiens 14 lignes qui satisfont ma requête.

    Avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    and TO_DATE(PDM.PDM_PRODUCTITEM.CREATEDON,'dd/MM/YYYY') = '10/12/2003'
    J'obtiens : 0 ligne!
    Je comprends pas comment se fait la différence. Les côtes ne me semblaient pas appropriées pour une date mais si on ne les met pas, ça me dit que les types de données sont incohérentes.


    Comment pouvoir faire une ligne de type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    and TO_DATE(PDM.PDM_PRODUCTITEM.CREATEDON,'dd/MM/YYYY') BETWEEN '10/12/2003' and '10/12/2004'
    Qui est mon but final ?
    Merci déjà pour votre aide et si quelqu'un a la solution, qu'il n'hésite pas

  8. #8
    Membre habitué Avatar de nantais
    Inscrit en
    Juillet 2004
    Messages
    158
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 158
    Points : 192
    Points
    192
    Par défaut
    As tu essayé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    and TO_CHAR(PDM.PDM_PRODUCTITEM.CREATEDON,'dd/MM/YYYY') BETWEEN '10/12/2003' and '10/12/2004'
    en effet, si ta variable est au format date, la convertir en date ne veut rien dire, en revanche la convertir en format caractère (avec un convention de date bien précise) est plus logique...

  9. #9
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    Ou alors, si il sagit de comparer la date sans les heures :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    and TRUNC(PDM.PDM_PRODUCTITEM.CREATEDON) BETWEEN '10/12/2003' and '10/12/2004'

  10. #10
    HqX
    HqX est déconnecté
    Futur Membre du Club
    Inscrit en
    Octobre 2004
    Messages
    9
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9
    Points : 7
    Points
    7
    Par défaut
    Merci orafrance

    J'arrivais pas à me servir de TRUNC ta ligne est pile poil ce dont j'avais besoin !

  11. #11
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    de rien, et pense au forum Oracle si besoin

  12. #12
    Rédacteur

    Inscrit en
    Septembre 2004
    Messages
    626
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 626
    Points : 848
    Points
    848
    Par défaut
    Si jamais tu as un index sur PDM.PDM_PRODUCTITEM.CREATEDON, il peut être judicieux de réécrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    and TRUNC(PDM.PDM_PRODUCTITEM.CREATEDON) BETWEEN '10/12/2003' and '10/12/2004'
    en

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    and PDM.PDM_PRODUCTITEM.CREATEDON BETWEEN to_date('10/12/2003', 'dd/mm/yyyy') and to_date('10/12/2004', 'dd/mm/yyyy')-1/24/60/60
    (1/24/60/60 réprésente 1sec)


    Laly.
    In the heart of the truly greats, perfection is never achieved but endlessly pursued.

    Mon article sur les fonctions analytiques d'Oracle (calcul de moyennes mobiles, de quartiles et bien d'autres...)

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

Discussions similaires

  1. Clause Where sur une Date
    Par Zebulonn dans le forum Installation
    Réponses: 31
    Dernier message: 20/10/2005, 11h56
  2. Problème de select sur une date (DATETIME....)
    Par zeldoi5 dans le forum Langage SQL
    Réponses: 7
    Dernier message: 16/05/2005, 11h19
  3. requette sur une date
    Par AlphonseBrown dans le forum Langage SQL
    Réponses: 13
    Dernier message: 04/04/2005, 12h41
  4. Problème lors d'un Update sur une date
    Par Nany dans le forum ASP
    Réponses: 3
    Dernier message: 19/05/2004, 22h37
  5. [SQL] Conditions sur une date dans une requete
    Par poufouille dans le forum Bases de données
    Réponses: 4
    Dernier message: 17/03/2004, 14h25

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