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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2003
    Messages
    1 309
    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 309
    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 ?

  2. #2
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 288
    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

  3. #3
    Membre éprouvé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2003
    Messages
    1 309
    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 309
    Par défaut
    Merci pour l'info. Je crois que je vais devoir passer les dates en texte.

  4. #4
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 288
    Par défaut
    Provisoirement j'espère !

  5. #5
    Membre éprouvé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2003
    Messages
    1 309
    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 309
    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).

  6. #6
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 288
    Par défaut
    Ce que tu peux faire, c'est une colonne texte avec un trigger alimentant une colonne date.

  7. #7
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 882
    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 882
    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';
    @+

  8. #8
    Membre éprouvé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2003
    Messages
    1 309
    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 309
    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.

  9. #9
    Membre éprouvé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2003
    Messages
    1 309
    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 309
    Par défaut
    Je viens de voir dans la doc que MySQL initialise automatiquement le premier timestamp. Je vais essayer de contourner ça.

  10. #10
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 882
    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 882
    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 ?

    @+

  11. #11
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 882
    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 882
    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 ?

    @+

  12. #12
    Membre éprouvé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2003
    Messages
    1 309
    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 309
    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');

  13. #13
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 288
    Par défaut
    On en est où ? Tu as passé tes colonnes à DATETIME pour éviter le ON UPDATE ?

  14. #14
    Membre éprouvé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2003
    Messages
    1 309
    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 309
    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.

  15. #15
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 882
    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 882
    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" ?

    @+

  16. #16
    Membre éprouvé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2003
    Messages
    1 309
    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 309
    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).

  17. #17
    Membre éprouvé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2003
    Messages
    1 309
    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 309
    Par défaut
    En modifiant le my.ini et supprimant le "default 0" j'ai le même truc bizarre qu'avec datetime : je n'ai aucune des deux colonnes de fin.

  18. #18
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 288
    Par défaut
    1) j'ai testé avec des DATETIME, je n'ai aucun problème. Je pense que soit tes valeurs Access ne correspondent pas exactement à ton format, soit il y a un problème dans tes tests. Tu es sûr de ne pas avoir de secondes ?

    Voici mon test :
    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
    create table employe(
    	EMPLOYE_DEBUT DATETIME,
    	EMPLOYE_FIN DATETIME,
    	TXT_EMP_DEBUT varchar(20),
    	TXT_EMP_FIN varchar(20)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
     
    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');
     
    INSERT INTO employe(txt_emp_debut, txt_emp_fin) VALUES ('01/07/2015 11:22', '07/01/2016 22:11') ;
     
    SELECT * FROM employe ;
    +---------------------+---------------------+------------------+------------------+
    | EMPLOYE_DEBUT | EMPLOYE_FIN | TXT_EMP_DEBUT | TXT_EMP_FIN |
    +---------------------+---------------------+------------------+------------------+
    | 2015-07-01 11:22:00 | 2016-01-07 22:11:00 | 01/07/2015 11:22 | 07/01/2016 22:11 |
    +---------------------+---------------------+------------------+------------------+
    1 row in set (0.00 sec)
    2) après avoir modifié le my.ini, il faut redémarrer MySQL.

  19. #19
    Membre éprouvé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2003
    Messages
    1 309
    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 309
    Par défaut
    1) Il n'y a pas de secondes, du moins dans les 100 premières lignes ; je n'ai pas regardé toutes les lignes.
    2) J'ai bien redémarré le serveur.

    Je vais proposer une solution par FTP + shell faisant l'import. Cela me parait plus simple.

  20. #20
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 882
    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 882
    Par défaut
    Salut Christophe.

    En modifiant le my.ini et supprimant le "default 0" j'ai le même truc bizarre qu'avec datetime : je n'ai aucune des deux colonnes de fin.
    J'ai pas bien compris.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    [wampmysqld]
    explicit_defaults_for_timestamp = on
    La directive à mettre dans le fichier "my.ini" doit se placer dans la section "wampmysqld" qui est le nom du service mysql.

    De plus, cette directive ne fonctionne que pour le type "timestamp" et non le type "datetime".
    Si tu veux conserver la totalité du timestamp, à l'identique de ce qui existe sous DB2, tu dois mettre "timestamp(6)" pour avoir les millionièmes de secondes.

    Il faut savoir, à l'inverse de DB2, que Mysql met la même valeur du timestamp, même si le chargement dure plusieurs minutes.

    Et comme l'indique Antoun, ne pas oublier de "redémarrer les services", en cliquant sur cette option dans l'icône wampserver.

    Mais maintenant (après la réunion de cet après-midi) nous sommes d'accord pour abandonner cette solution et utiliser le FTP pour envoyer les fichiers qui seront chargés par "LOAD DATA INFILE".
    Comment vas-tu résoudre ton problème de format de la date ?
    Soit tu utilises ma fonction que tu peux introduire dans le 'LOAD DATA INFILE'.
    Soit tu fais en sorte de ne pas avoir de date sous le mauvais format avant de charger ton fichier dans ta table mysql.

    Si tu as un problème pour construire ton "LOAD DATA INFILE", il te suffit de nous indiquer ce que tu ne sais pas faire.

    @+

+ 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, 07h20
  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, 21h35
  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, 15h57
  4. [Dates] Format de date MySQL vers français
    Par tcompagnon dans le forum Langage
    Réponses: 4
    Dernier message: 17/07/2007, 13h02
  5. Format français date=>date MySQL
    Par john.dbc dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 25/08/2006, 13h28

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