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 Firebird Discussion :

Format DATE sans YEAR


Sujet :

SQL Firebird

  1. #1
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Février 2006
    Messages
    562
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations forums :
    Inscription : Février 2006
    Messages : 562
    Points : 859
    Points
    859
    Par défaut Format DATE sans YEAR
    Bonjour à tous.

    Dans le cadre d'une restructuration (et normalisation) d'une base de données un peu ancienne j'aimerai connaitre votre avis sur un point.

    J'ai une table ou je stocke des périodes d'affinage pour des huîtres. Ma base actuelle stocke les périodes avec un format de colonne DATE ce qui simplifie les calculs quand je calcul un nombre de jour d'affinage.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CREATE TABLE T_AFFINAGE_PERIODE_AFP
    (
      AFP_ID INTEGER NOT NULL,
      AFP_DEBUT DATE NOT NULL,
      AFP_FIN DATE NOT NULL,
      ...,
      CONSTRAINT PK_AFFINAGE_PERIODE PRIMARY KEY (AFP_ID)
    );
    Seulement voilà, les périodes d'affinage sont définies par le couple JJ/MM et peu importe l'année (ex: affinage du 15/03 au 31/09). L'interface utilisateur de mon application n'affiche que le jour et le mois de la période mais l'année est bien présente dans la table. J'ai pensé utiliser des types SMALLINT pour stocker le jour et le mois du début et de fin d'affinage mais les calculs sont plus compliqué.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    CREATE TABLE T_AFFINAGE_PERIODE_AFP
    (
      AFP_ID INTEGER NOT NULL,
      AFP_JOUR_DEBUT SMALLINT NOT NULL,
      AFP_MOIS_DEBUT SMALLINT NOT NULL,
      AFP_JOUR_FIN SMALLINT NOT NULL,
      AFP_MOIS_FIN SMALLINT NOT NULL,
    ...,
      CONSTRAINT PK_AFFINAGE_PERIODE PRIMARY KEY (AFP_ID)
    );
    J'aimerai en fait pouvoir stocker une date au format JJ/MM sans l'année.

    Merci.

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 030
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 030
    Points : 40 928
    Points
    40 928
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    rien ne vous empêche d'utiliser date et des fonctions comme EXTRACT
    Avantage d'utiliser les dates il est très facile de faire des ajouts de mois DATEADD

    AMHA, il vous faut garder le type date certainement plus normalisé que deux colonnes JOUR MOIS, ainsi vous pourrez même mettre des contraintes AFP_DEBUT<AFP_FIN, le problème de saisie jour mois est uniquement un problème d'interface utilisateur

    Au pire, si vous tenez à avoir une donnée en JJ/MM donc string vous pouvez toujours faire une colonne calculée EXTRACT(DAY FROM AFP_DEBUT)||'/'||EXTRACT(MONTH FROM AFP_DEBUT)
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  3. #3
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Février 2006
    Messages
    562
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations forums :
    Inscription : Février 2006
    Messages : 562
    Points : 859
    Points
    859
    Par défaut
    Merci SergioMaster pour votre réponse.

    J'utilise déjà les fonctions EXTRACT et DATEADD dans mes calculs d'affinage. Je vais donc continuer à utiliser le type DATE pour mes colonnes de début et de fin d'affinage malgré que je n'aime pas stocker des données inutiles dans ma base, en l'occurence l'année, même si celle ci est "invisible" pour l'utilisateur final.

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 030
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 030
    Points : 40 928
    Points
    40 928
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    Si ce n'est qu'une question de place je ferais remarquer que la date est stockée en format numérique et donc ne prend pas plus d'octets que deux entiers
    Sources https://firebirdsql.org/file/documen...datatypes.html
    SmallInt 16 bits
    Date 32 Bits
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  5. #5
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 430
    Points
    28 430
    Par défaut
    mise à part le format date qui permet toutes les opérations, il est possible de stocker 100 * Mois + Jour, donc 15/03 => 315, et 31/09 => 931 (on peut aussi utiliser 32 * Mois + Jour mais c'est moins lisible). On pourra faire des comparaison facilement, mais il devient plus difficile de compter le nombre de jours entre deux dates par exemple, et si on stocke le numéro du jour dans l'année, ça change d'une année à l'autre à cause du mois de février...c'est pour cela qu'en général on garde le format DATE
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  6. #6
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 760
    Points : 52 541
    Points
    52 541
    Billets dans le blog
    5
    Par défaut
    Une date étant un vecteur, une date sans année n'a absolument aucun sens. Ce n'est pas une date, mais du n'importe quoi…

    Date::

    ANNEE
    ANNEE + MOIS
    ANNEE + MOIS + JOUR
    ANNEE + MOIS + JOUR + HEURE
    ANNEE + MOIS + JOUR + HEURE + MINUTE
    ANNEE + MOIS + JOUR + HEURE + MINUTE + SECONDE
    ANNEE + MOIS + JOUR + HEURE + MINUTE + SECONDE + tantième de seconde

    C'est juste une question de précision, comme les nombres, mais les dates ne sont pas décimale….
    Devinez de quel nombre je parle :
    3
    3.1
    3.14
    3.141
    3.1415
    3.14159
    3.141592
    3.1415923
    3.14159235
    3.141592356

    Imaginez ce qui va se passer pour vos périodes d'huitres si le début est au 30 décembre et la fin au 4 janvier....

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  7. #7
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Février 2006
    Messages
    562
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations forums :
    Inscription : Février 2006
    Messages : 562
    Points : 859
    Points
    859
    Par défaut
    Bonjour.

    C'est bien la première fois que j'entend parler de vecteur pour représenter une date !

    C'est juste une question de précision
    Je comprend mieux le sens de précision pour isoler le jour et mois dans une date. Comme je l'ai dit plus haut, j'utilise déjà le format DATE pour stocker le début et la fin d'une période. Il m'est donc très facile d'extraire le jour et le mois d'une date avec des fonctions comme EXTRACT pour calculer la durée d'affinage d'un lot d'huîtres. Le problème c'est que je me complique toujours la vie alors que c'est si simple.

    Imaginez ce qui va se passer pour vos périodes d'huitres si le début est au 30 décembre et la fin au 4 janvier....
    J'imagine très bien puisque c'est mon métier

    Merci à vous pour vos explications.

  8. #8
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 030
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 030
    Points : 40 928
    Points
    40 928
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par ddaime Voir le message
    J'imagine très bien puisque c'est mon métier
    D'où, ça donne l'eau, ou plutôt le muscadet qui se produit juste à côté de chez moi, à la bouche
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  9. #9
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Février 2006
    Messages
    562
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations forums :
    Inscription : Février 2006
    Messages : 562
    Points : 859
    Points
    859
    Par défaut
    A Marennes et si vous passez dans les environs n'hésitez surtout pas à nous rendre visite. Nous vous accueillerons avec grand plaisir pour vous faire déguster nos merveilleux coquillages.

  10. #10
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 378
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 378
    Points : 19 054
    Points
    19 054
    Par défaut
    Salut à tous.

    Citation Envoyé par SQLPRO
    Une date étant un vecteur
    Je n'ai jamais entendu dire qu'une date est un vecteur. D'où sortez-vous cette notion ?

    Citation Envoyé par SQLPRO
    Devinez de quel nombre je parle :
    Je n'en sais rien car Pi chez moi vaut : 3,141 592 653 589 793 238 462 6
    D'où sortez-vous ce nombre : 3,141 592 356 ?
    --> http://www.gecif.net/articles/mathem...decimales.html

    Citation Envoyé par ddaime
    J'aimerai en fait pouvoir stocker une date au format JJ/MM sans l'année.
    Comme le dit SergioMaster, si c'est un problème de place, autant utiliser le type date au lieu de séparer en deux colonnes le mois et le jour.

    Paul TOTH préconise de stocker votre JJ/MM dans le type smallint en faisant 100*MM + JJ, ce qui donne sur "15/03" --> 0315.

    Je me pose la question de l'utilité de cette date ? Vous dites :
    Citation Envoyé par ddaime
    Seulement voilà, les périodes d'affinage sont définies par le couple JJ/MM et peu importe l'année
    Si le but est de calculer la différence entre deux dates, la solution est de stocker vos dates en utilisant une date pivot.

    Prenons le cas de SQLPRO :
    Citation Envoyé par SQLPRO
    Imaginez ce qui va se passer pour vos périodes d’huîtres si le début est au 30 décembre et la fin au 4 janvier...
    L'année pivot 2018 et elle commence en '2018-12-30' et se termine en '2019-01-04'. Je sais, c'est un exemple extrême.

    Pour l'année pivot, vous prenez la date '2017-31-12'. Et vous stockez le nombre de jours en faisant le différence entre :
    --> '2018-12-30' - '2017-12-31' soit 364 jours
    --> '2019-01-04' - '2017-12-31' soit 369 jours

    Si vous avez besoin de faire une différence en nombre de jours alors le calcul donne : 369 - 364 = 5.
    Cette solution vous permet de ne stocker que les informations utiles pour vous.
    Et de pouvoir faire vos calculs sur les périodes d'affinage.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  11. #11
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 030
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 030
    Points : 40 928
    Points
    40 928
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par ddaime Voir le message
    A Marennes et si vous passez dans les environs n'hésitez surtout pas à nous rendre visite.
    Ce sera avec plaisir les marennes étant mes huitres préférées ex æquo avec les belons
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

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

Discussions similaires

  1. Configuration Sybase ASE 15 accepter le format date : MM-DD-Year
    Par arnovodao dans le forum Adaptive Server Enterprise
    Réponses: 1
    Dernier message: 06/06/2017, 15h33
  2. [MySQL] Recherche format Date sans prendre en compte Année
    Par bouuuh dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 13/07/2014, 15h11
  3. Recuperer la date sans l'heur dans un champ datetime
    Par bob33 dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 22/06/2010, 12h59
  4. mettre une date en format dd/mm/year en paramètre d'une fonction
    Par friedamichelle dans le forum Général Java
    Réponses: 2
    Dernier message: 03/03/2008, 18h09
  5. Format date
    Par cochet dans le forum Bases de données
    Réponses: 4
    Dernier message: 02/03/2004, 08h37

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