1. #1
    Débutant
    Profil pro
    Inscrit en
    mai 2005
    Messages
    2 461
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : mai 2005
    Messages : 2 461
    Points : 775
    Points
    775

    Par défaut Comment bien choisir le type de champ pour des heures

    Bonjour à tous,

    Je recois de donnée avec des heures. Indépendament à ma volonté, le heure reçue sont sous ce format

    2800386500
    2017-10-08T11:50:20.923179Z
    J'ai créé ma base de donnée avec des champs dont le premier est de type 'timestamp' et l'autre de type 'datatime'

    Pour la premiere heure, je ne pensais pas avoir de problème, puisque que c'est un timestamp et que j'ai choiisi un champ de type timestamp.
    Mais voilà, il n'y a rien d'enregistré dans ma base de donnée. La valeur est 0000-00-00 00-00-00, alors qu'il devait avoir 2800386500
    20158-9-27 22:08:20
    Cici dit, j'admets qu'il y a un problème avec l'heure. Mais ne devrais-je pas avoir une valeur, au lieu de 0000-00-00 00:00:00?

    Pour ma deuxième heure, je ne connais pas ce format : 2017-10-08T11:50:20.923179Z
    Quel est le bon format de mon champ que je dois choisir pour ce type de format d'heure? Est-ce que 'datetime' est le bon choix?
    Est-ce que 2017-10-08T11:50:20.923179Z est l'heure UTC?

    Merci

    2800386500
    Il ne suffit pas de tout savoir. Vouloir et persévérer, c'est déjà presque tout!

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    juillet 2005
    Messages
    28 460
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : juillet 2005
    Messages : 28 460
    Points : 42 321
    Points
    42 321

    Par défaut

    Datetime est le bon type pour stocker une date.

    Le format "timestamp" de mysql n'est pas un timestamp unix mais un colonne datetime qui prend par défaut la date actuelle, tu peux utiliser FROM_UNIXTIME() pour convertir ta valeur au format datetime.
    Le deuxième format est ISO 8601, tu peux utiliser la fonction STR_TO_DATE() pour le convertir.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    juin 2003
    Messages
    6 357
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : juin 2003
    Messages : 6 357
    Points : 10 213
    Points
    10 213

    Par défaut

    petite parenthèse, je ne sais pas si cela va aider à régler le problème : 2800386500 n'as pas l'air d'être un timestamp puisque cela correspond à la date du 27/09/2058

  4. #4
    Expert éminent Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    février 2011
    Messages
    2 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 77
    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 : 2 898
    Points : 8 557
    Points
    8 557

    Par défaut

    Salut pierrot10.

    Je pense que vous avez un problème avec votre date dans la représentation unix. Voici ce qui est dit sous mysql :
    The valid range of values is the same as for the TIMESTAMP data type: '1970-01-01 00:00:01.000000' UTC to '2038-01-19 03:14:07.999999' UTC.
    --> https://dev.mysql.com/doc/refman/5.7...unix-timestamp

    Et voici ce que j'obtiens sous mysql :
    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    --------------
    SET session time_zone = '+00:00'
    --------------
     
    --------------
    commit
    --------------
     
    --------------
    SELECT @@time_zone
    --------------
     
    +-------------+
    | @@time_zone |
    +-------------+
    | +00:00      |
    +-------------+
    --------------
    SELECT UNIX_TIMESTAMP('1970-01-01 00:00:00')
    --------------
     
    +---------------------------------------+
    | UNIX_TIMESTAMP('1970-01-01 00:00:00') |
    +---------------------------------------+
    |                                     0 |
    +---------------------------------------+
    --------------
    SELECT UNIX_TIMESTAMP('1970-01-01 00:00:01')
    --------------
     
    +---------------------------------------+
    | UNIX_TIMESTAMP('1970-01-01 00:00:01') |
    +---------------------------------------+
    |                                     1 |
    +---------------------------------------+
    --------------
    SELECT UNIX_TIMESTAMP('2038-01-19 03:14:07.999999')
    --------------
     
    +----------------------------------------------+
    | UNIX_TIMESTAMP('2038-01-19 03:14:07.999999') |
    +----------------------------------------------+
    |                            2147483647.999999 |
    +----------------------------------------------+
    --------------
    SELECT UNIX_TIMESTAMP('2038-01-19 03:14:08.000000')
    --------------
     
    +----------------------------------------------+
    | UNIX_TIMESTAMP('2038-01-19 03:14:08.000000') |
    +----------------------------------------------+
    |                                     0.000000 |
    +----------------------------------------------+
     
    Appuyez sur une touche pour continuer...
    En résumé, l'intervalle valide va de 0 jusqu'à 2.147.483.647. Or 2.147.483.647 correspond à 2^31 - 1.
    Donc 2.800.386.500 > 2.147.483.647 est hors de l'intervalle.
    En dehors, de cet intervalle, la conversion vous donnera zéro !

    Pour la conversion de votre date sous le format ISO 8601, vous devez passer par la fonction "date_format()", comme dans l'exemple ci-après :
    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    --------------
    SET AUTOCOMMIT = 0
    --------------
     
    --------------
    START TRANSACTION
    --------------
     
    --------------
    DROP DATABASE IF EXISTS `base`
    --------------
     
    --------------
    CREATE DATABASE `base`
            DEFAULT CHARACTER SET `latin1`
            DEFAULT COLLATE       `latin1_general_ci`
    --------------
     
    --------------
    DROP TABLE IF EXISTS `test`
    --------------
     
    --------------
    CREATE TABLE `test`
    ( `id`        integer unsigned  not null auto_increment primary key,
      `num`       integer unsigned  not null,
      `string`    varchar(255)      not null
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    insert into `test` (`num`,`string`) value
      (2100386500,'2017-10-08T11:50:20.923179Z')
    --------------
     
    --------------
    select * from `test`
    --------------
     
    +----+------------+-----------------------------+
    | id | num        | string                      |
    +----+------------+-----------------------------+
    |  1 | 2100386500 | 2017-10-08T11:50:20.923179Z |
    +----+------------+-----------------------------+
    --------------
    select from_unixtime(num),
           date_format(string, '%Y-%m-%d %h:%i:%s.%f')
    from `test`
    --------------
     
    +---------------------+---------------------------------------------+
    | from_unixtime(num)  | date_format(string, '%Y-%m-%d %h:%i:%s.%f') |
    +---------------------+---------------------------------------------+
    | 2036-07-23 02:41:40 | 2017-10-08 11:50:20.923179                  |
    +---------------------+---------------------------------------------+
    --------------
    COMMIT
    --------------
     
    --------------
    SET AUTOCOMMIT = 1
    --------------
     
    Appuyez sur une touche pour continuer...
    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

Discussions similaires

  1. Comment choisir le type de champ ?
    Par siva27 dans le forum MS SQL-Server
    Réponses: 7
    Dernier message: 08/08/2013, 14h38
  2. [WD14] Comment bien choisir le bon champ
    Par papydev dans le forum WinDev
    Réponses: 5
    Dernier message: 27/01/2010, 12h19
  3. [SQL Server] Quel type de champ pour du commentaire
    Par brmartin dans le forum Langage SQL
    Réponses: 6
    Dernier message: 24/07/2006, 12h51
  4. [Webdesign] Comment bien choisir un webdesigner ?
    Par megane dans le forum Webdesign & Ergonomie
    Réponses: 3
    Dernier message: 02/06/2006, 11h13
  5. [Modélisation] Type de champs pour champs récurents ?
    Par shadeoner dans le forum Décisions SGBD
    Réponses: 4
    Dernier message: 24/03/2006, 11h29

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