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 Procédural MySQL Discussion :

[MySQL 5] Trigger formatant la date


Sujet :

SQL Procédural MySQL

  1. #1
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2003
    Messages
    1 303
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 303
    Points : 1 380
    Points
    1 380
    Par défaut [MySQL 5] Trigger formatant la date
    Bonjour,

    j'essaie d'importer des dates au format "DD/MM/YYYY H:i" dans MySQL ("YYYY-MM-DD H:i:s") sans modifier le fichier d'import (csv). J'essaie de faire un trigger pour modifier la date avant l'insert mais je n'obtient que des dates nulles ("0000-00-00 00:00:00").

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CREATE TRIGGER oreDateIns BEFORE INSERT ON employe
    FOR EACH
    ROW SET NEW.employe_debut = DATE_FORMAT(NEW.employe_debut, '%d/%m/%Y %H:%i'),
    NEW.employe_fin = DATE_FORMAT(NEW.employe_fin, '%d/%m/%Y %H:%i');
    Pouvez-vous me dire ce qui ne va pas dans mon trigger ?
    Christophe

    Pensez à mettre quand c'est le cas.

  2. #2
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 277
    Points : 11 733
    Points
    11 733
    Par défaut
    Si je me souviens bien, MySQL vérifie le type avant d'exécuter le trigger, donc toute tentative de reformater des date invalides en dates valides par un trigger est vouée à l'échec
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  3. #3
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2003
    Messages
    1 303
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 303
    Points : 1 380
    Points
    1 380
    Par défaut
    Merci pour l'info. Je crois que je vais devoir passer les dates en texte.
    Christophe

    Pensez à mettre quand c'est le cas.

  4. #4
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 277
    Points : 11 733
    Points
    11 733
    Par défaut
    Provisoirement j'espère !
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  5. #5
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2003
    Messages
    1 303
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 303
    Points : 1 380
    Points
    1 380
    Par défaut
    Il faut que l'utilisateur passe par Access pour faire l'import (pas le choix malheureusement), donc ça ne sera probablement pas du provisoire à moins que je trouve une autre solution de contournement (faire l'import via un petit site web si j'arrive à les faire abandonner Access pour ça).
    Christophe

    Pensez à mettre quand c'est le cas.

  6. #6
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 277
    Points : 11 733
    Points
    11 733
    Par défaut
    Ce que tu peux faire, c'est une colonne texte avec un trigger alimentant une colonne date.
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  7. #7
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2003
    Messages
    1 303
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 303
    Points : 1 380
    Points
    1 380
    Par défaut
    J'ai créé le trigger suivant pour mettre à jour mes dates à partir du texte (txt_emp_debut et txt_emp_fin) comme vous me l'avez conseillé, mais je ne comprends pas pourquoi il met la date du jour dans employe_debut et employe_fin.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CREATE TRIGGER oreDateIns BEFORE INSERT ON employe
    FOR EACH ROW SET 
    NEW.employe_debut = DATE_FORMAT(NEW.txt_emp_debut, '%d/%m/%Y %H:%i'),
    NEW.employe_fin = DATE_FORMAT(NEW.txt_emp_fin, '%d/%m/%Y %H:%i');
    Les champs txt_emp_debut et txt_emp_fin sont bien remplis avec les bonnes dates.
    Christophe

    Pensez à mettre quand c'est le cas.

  8. #8
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 277
    Points : 11 733
    Points
    11 733
    Par défaut
    DATE_FORMAT est la fonction qui convertit les dates en texte. Si j'ai bien compris, tu veux faire le contraire, donc c'est STR_TO_DATE.
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  9. #9
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2003
    Messages
    1 303
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 303
    Points : 1 380
    Points
    1 380
    Par défaut
    Merci, c'est effectivement mieux.
    J'ai un problème bizarre, la date de début reste toujours à celle du jour. En faisant "show columns" j'obtient :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    +---------------------+-------------+------+-----+---------------------+-----------------------------+
    | Field               | Type        | Null | Key | Default             | Extra                       |
    +---------------------+-------------+------+-----+---------------------+-----------------------------+
    | EMPLOYE_DEBUT       | timestamp   | NO   |     | CURRENT_TIMESTAMP   | on update CURRENT_TIMESTAMP |
    | EMPLOYE_FIN         | timestamp   | NO   |     | 0000-00-00 00:00:00 |                             |
    alors que pour le create j'ai fait la même chose pour les deux dates :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    create table employe(
    	...
    	EMPLOYE_DEBUT timestamp,
    	EMPLOYE_FIN timestamp,
    	TXT_EMP_DEBUT varchar(20),
    	TXT_EMP_FIN varchar(20),
    	...
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
    J'ai fais un drop de la base, redémarré MySQL et tout recréé mais ça n'a rien changé. J'ai constaté que dans les autres tables, tous les premiers timestamp sont pareils (avec "on update CURRENT_TIMESTAMP") alors que tous ont été déclaré en tant que timestamp simple (sans "NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP"). Il n'y a pas le problème sur les champs de type date.
    Je n'ai pas fait de paramétrage particulier sur mon MySQL 5.6.25. Je ne comprends pas du tout ce qui se passe.
    Christophe

    Pensez à mettre quand c'est le cas.

  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 346
    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 346
    Points : 18 958
    Points
    18 958
    Par défaut
    Salut Christophe.

    Au lieu de faire un trigger, cela ne serait-il pas plus souple de faire une fonction ?

    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
    17
    18
    19
    20
    21
    -- ==================
    -- Function `chgdate`
    -- ==================
     
    DELIMITER $$
     
    CREATE FUNCTION chgdate(date_in text) RETURNS datetime
      DETERMINISTIC
      LANGUAGE SQL
    BEGIN
      RETURN (str_to_date(date_in, '%d/%m/%Y %H:%i'));
    END$$
    DELIMITER ;
     
    COMMIT;
     
    -- ======================
    -- Changement format date
    -- ======================
     
    select chgdate('05/03/2015 23:30') as 'date';
    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  11. #11
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2003
    Messages
    1 303
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 303
    Points : 1 380
    Points
    1 380
    Par défaut
    Mon problème est lors de l'import de fichiers CSV, qui doit être fait via Access. Il faut donc un trigger "before insert", une fonction ne suffit pas, Access se charge de l'affichage.
    Christophe

    Pensez à mettre quand c'est le cas.

  12. #12
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2003
    Messages
    1 303
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 303
    Points : 1 380
    Points
    1 380
    Par défaut
    Je viens de voir dans la doc que MySQL initialise automatiquement le premier timestamp. Je vais essayer de contourner ça.
    Christophe

    Pensez à mettre quand c'est le cas.

  13. #13
    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 346
    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 346
    Points : 18 958
    Points
    18 958
    Par défaut
    Salut christophe.

    Et comment faites-vous pour passer du fichier .csv à la table mysql ? Est-ce 'access' qui se charge de votre import ?
    Si vous faites un "load data local" alors vous pouvez utiliser la fonction sans problème.

    Si en faisant un "show columns from employe", vous voyez le "default curren_timestamp", c'est qu'il est dans la déclarative de votre table mysql.
    Mais a priori, si vous ne renseignez pas la date enploye_debut, il est normal qu'elle soit renseignée avec sa valeur par défaut.
    Sinon y-a-t-il un trigger ou une procédure stockée qui viendrait renseignée cette colonne ?

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

  14. #14
    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 346
    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 346
    Points : 18 958
    Points
    18 958
    Par défaut
    Salut christophe.

    Je viens de voir dans la doc que MySQL initialise automatiquement le premier timestamp. Je vais essayer de contourner ça.
    J'ai fait le test et si vous ne mettez rien en tant que default, il ne va pas vous écraser avec la date current.

    Etes-vous certain que vous affichez la bonne table ?
    Un 'use nom de votre base de données' a-t-il été fait au préalable ?

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

  15. #15
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 277
    Points : 11 733
    Points
    11 733
    Par défaut
    Citation Envoyé par Christophe P. Voir le message
    Merci, c'est effectivement mieux.
    J'ai un problème bizarre, la date de début reste toujours à celle du jour. En faisant "show columns" j'obtient :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    +---------------------+-------------+------+-----+---------------------+-----------------------------+
    | Field               | Type        | Null | Key | Default             | Extra                       |
    +---------------------+-------------+------+-----+---------------------+-----------------------------+
    | EMPLOYE_DEBUT       | timestamp   | NO   |     | CURRENT_TIMESTAMP   | on update CURRENT_TIMESTAMP |
    | EMPLOYE_FIN         | timestamp   | NO   |     | 0000-00-00 00:00:00 |                             |
    alors que pour le create j'ai fait la même chose pour les deux dates :
    En fait c'est le comportement par défaut du type TIMESTAMP. MySQL considère que si tu utilises ce type c'est que tu veux forcément une date de màj auto, donc la première colonne TIMESTAMP passe automatiquement en ON UPDATE CURRENT_TIMESTAMP. Il faut que tu utilises DATETIME à la place.
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  16. #16
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2003
    Messages
    1 303
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 303
    Points : 1 380
    Points
    1 380
    Par défaut
    MySQL modifie automatiquement le premier timestamp : http://dev.mysql.com/doc/refman/5.5/...alization.html
    Comme indiqué précédemment le premier timestamp déclaré simplement "timestamp" est visible, via "show columns" comme étant non nul et initialisé à "CURRENT_TIMESTAMP" (cf. message de 11h54).
    La table est la bonne.

    Access se charge des imports. Il y a une connexion ODBC vers MySQL et l'import se fait via l'interface d'Access.
    Je peux faire un "load data infile" pour l'import mais il m'est demandé de passer par Access.
    L'import via Access ne fonctionne pas à cause du format de date (c'est ce que j'ai identifié, en passant les dates en texte ça fonctionne). J'essaie donc de contourner le problème en utilisant un trigger et des champs texte dans lesquels j'importe la date au format français :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CREATE TRIGGER oreDateIns BEFORE INSERT ON employe
    FOR EACH ROW SET 
    NEW.employe_debut = STR_TO_DATE(NEW.txt_emp_debut, '%d/%m/%Y %H:%i'),
    NEW.employe_fin = STR_TO_DATE(NEW.txt_emp_fin, '%d/%m/%Y %H:%i');
    Christophe

    Pensez à mettre quand c'est le cas.

  17. #17
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 277
    Points : 11 733
    Points
    11 733
    Par défaut
    On en est où ? Tu as passé tes colonnes à DATETIME pour éviter le ON UPDATE ?
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  18. #18
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2003
    Messages
    1 303
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 303
    Points : 1 380
    Points
    1 380
    Par défaut
    Je viens de finir mes tests (faits plusieurs fois car résultats bizarres). Avec datetime les deux colonnes de fin restent vides ! En ajoutant "null" il y a aussi des colonnes vides. Ce qui fonctionne c'est de déclarer tous les timestamp comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	EMPLOYE_DEBUT timestamp default 0,
    	EMPLOYE_FIN timestamp default 0,
    Etape 1 faite... je vais maintenant passer à l'étape 2 : exécuter des requêtes Access sur une base MySQL !

    Merci Antoun.
    Christophe

    Pensez à mettre quand c'est le cas.

  19. #19
    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 346
    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 346
    Points : 18 958
    Points
    18 958
    Par défaut
    Salut Christophe.

    Je me suis demandé pourquoi chez moi, je n'avais pas ce genre de problème.
    Et bien, j'ai un paramétrage dans le fichier "my.ini" qui permet d'éviter que mysql me force à sa convenance le type "timestamp".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    explicit_defaults_for_timestamp = on
    Il suffit d'ajouter cela dans "my.ini" et de ne pas oublier de "redémarrer les services" de wampserver.
    Et du coup, inutile d'ajouter "default 0" derrière le type "timestamp".

    Pour revenir à l'import via access, est-ce que tu passes par l'API "CONNECTOR/ODBC 3.51 for MySQL" ?

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

  20. #20
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2003
    Messages
    1 303
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 303
    Points : 1 380
    Points
    1 380
    Par défaut
    Merci pour l'info Artemus24. Je n'ai pas encore accès à la base définitive mais je vais regarder le my.ini.
    J'utilise le connecteur ODBC 5.3.4 (mysql-connector-odbc-5.3.4-win32.msi).
    Christophe

    Pensez à mettre quand c'est le cas.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Choix du format de date timestamp Mysql ou timestamp Unix
    Par audreyc dans le forum Requêtes
    Réponses: 2
    Dernier message: 01/04/2009, 08h20
  2. Changer format de date - Mysql ignore le caractere \
    Par Peter K. dans le forum Requêtes
    Réponses: 1
    Dernier message: 01/01/2008, 22h35
  3. Modification de format de date dans un trigger
    Par Nious99 dans le forum SQL Procédural
    Réponses: 6
    Dernier message: 14/11/2007, 16h57
  4. [Dates] Format de date MySQL vers français
    Par tcompagnon dans le forum Langage
    Réponses: 4
    Dernier message: 17/07/2007, 14h02
  5. Format français date=>date MySQL
    Par john.dbc dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 25/08/2006, 14h28

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