une - mysql insert mysql




Devrais-je utiliser le type de données datetime ou timestamp dans MySQL? (20)

Recommanderiez-vous d'utiliser un champ datetime / datetime ou datetime et pourquoi (avec MySQL)?

Je travaille avec PHP côté serveur.


2016 + : je vous conseille de régler votre fuseau horaire Mysql sur UTC et d'utiliser DATETIME:

Tout framework frontal récent (Angular 1/2, react, Vue, ...) peut facilement et automatiquement convertir votre date / heure UTC en heure locale.

Aditionellement:

(Sauf si vous êtes susceptible de changer le fuseau horaire de vos serveurs)

Exemple avec AngularJs

// back-end: format for angular within the sql query
SELECT DATE_FORMAT(my_datetime, "%Y-%m-%dT%TZ")...

// font-end Output the localised time
{{item.my_datetime | date :'medium' }}

Tous les formats d’heure localisés sont disponibles ici: https://docs.angularjs.org/api/ng/filter/date


  1. TIMESTAMP est quatre octets vs huit octets pour DATETIME.

  2. Les horodatages sont également plus légers sur la base de données et indexés plus rapidement.

  3. Le type DATETIME est utilisé lorsque vous avez besoin de valeurs contenant à la fois des informations de date et d'heure. MySQL récupère et affiche les valeurs DATETIME au format 'AAAA-MM-JJ HH: MM: SS. La plage prise en charge est «1000-01-01 00:00:00 à» 9999-12-31 23:59:59.

Le type de données TIMESTAMP a une plage allant de '1970-01-01 00:00:01 UTC à' 2038-01-09 03:14:07 UTC. Ses propriétés varient en fonction de la version de MySQL et du mode SQL dans lequel le serveur est exécuté.

  1. DATETIME est constant tandis que TIMESTAMP est affecté par le paramètre time_zone.

Dépend de l'application, vraiment.

Envisagez de définir un horodatage par un utilisateur sur un serveur à New York, pour un rendez-vous à Sanghai. Désormais, lorsque l'utilisateur se connecte à Sanghai, il accède au même horodatage à partir d'un serveur mis en miroir à Tokyo. Il verra son rendez-vous à l'heure de Tokyo, décalé par rapport à l'heure de New York.

Donc, pour les valeurs qui représentent l'heure de l'utilisateur, comme un rendez-vous ou une planification, datetime est préférable. Il permet à l'utilisateur de contrôler la date et l'heure exactes souhaitées, quels que soient les paramètres du serveur. L'heure définie est l'heure définie, qui n'est pas affectée par le fuseau horaire du serveur, le fuseau horaire de l'utilisateur ou les modifications apportées au mode de calcul de l'heure d'été (oui, cela change).

D'autre part, pour les valeurs qui représentent l'heure du système, telles que les transactions de paiement, les modifications de table ou la journalisation, utilisez toujours des horodatages. Le système ne sera pas affecté par le déplacement du serveur vers un autre fuseau horaire ou par la comparaison entre des serveurs situés dans des fuseaux horaires différents.

Les horodatages sont également plus légers sur la base de données et indexés plus rapidement.


D'après mes expériences, si vous voulez un champ de date dans lequel l'insertion ne se produit qu'une seule fois et que vous ne voulez aucune mise à jour ni aucune action sur ce champ particulier, utilisez la date et l'heure .

Par exemple, considérons une table user avec un champ DATE D'ENREGISTREMENT . Dans cette table d' user , si vous souhaitez connaître la dernière heure de connexion d'un utilisateur particulier, utilisez un champ de type horodatage pour qu'il soit mis à jour.

Si vous créez la table à partir de phpMyAdmin le paramètre par défaut mettra à jour le champ d' horodatage lors de la mise à jour d'une ligne. Si votre horodatage ne se met pas à jour avec la mise à jour de la ligne, vous pouvez utiliser la requête suivante pour mettre à jour automatiquement un champ d' horodatage .

ALTER TABLE your_table
      MODIFY COLUMN ts_activity TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;

Il est intéressant de noter que dans MySQL, vous pouvez utiliser quelque chose dans les lignes ci-dessous lors de la création des colonnes de votre tableau:

on update CURRENT_TIMESTAMP

Cela mettra à jour l'heure à chaque fois que vous modifiez une ligne et est parfois très utile pour les dernières informations stockées stockées. Cela ne fonctionne qu'avec l'horodatage, pas avec datetime.


J'utilise toujours les champs DATETIME pour autre chose que les métadonnées de ligne (date de création ou modification).

Comme dev.mysql.com/doc/refman/5.1/en/datetime.html dans la documentation MySQL:

Le type DATETIME est utilisé lorsque vous avez besoin de valeurs contenant à la fois des informations de date et d'heure. MySQL récupère et affiche les valeurs DATETIME au format 'AAAA-MM-JJ HH: MM: SS. La plage prise en charge est «1000-01-01 00:00:00» à «9999-12-31 23:59:59».

...

Le type de données TIMESTAMP est compris entre «1970-01-01 00:00:01» UTC et «2038-01-09 03:14:07» UTC. Ses propriétés varient en fonction de la version de MySQL et du mode SQL dans lequel le serveur est exécuté.

Il est fort probable que vous atteigniez la limite inférieure d'utilisation de TIMESTAMP - par exemple, la date de naissance.


J'utiliserais toujours un timestamp Unix lorsque je travaillais avec MySQL et PHP. La raison principale en est que la méthode de date par défaut en PHP utilise un horodatage en tant que paramètre, de sorte qu'aucune analyse syntaxique ne serait nécessaire.

Pour obtenir le timestamp Unix actuel en PHP, il suffit de faire time();
et dans MySQL, SELECT UNIX_TIMESTAMP(); .


Je prends cette décision sur une base sémantique.

J'utilise un horodatage lorsque je dois enregistrer un moment (plus ou moins) fixe. Par exemple, lorsqu'un enregistrement a été inséré dans la base de données ou qu'une action de l'utilisateur a eu lieu.

J'utilise un champ date / heure lorsque la date / heure peut être définie et modifiée arbitrairement. Par exemple, lorsqu'un utilisateur peut enregistrer des rendez-vous modifiés ultérieurement.



La principale différence est que DATETIME est constant, alors que TIMESTAMP est affecté par le paramètre time_zone .

Il est donc important que vous ayez - ou pourriez avoir à l'avenir - des clusters synchronisés sur plusieurs fuseaux horaires.

En termes plus simples: si j’ai une base de données en Australie et que je fais un dump de cette base pour synchroniser / remplir une base de données en Amérique, TIMESTAMP sera mis à jour pour refléter le temps réel de l’événement dans le nouveau fuseau horaire, tandis que DATETIME toujours refléter l'heure de l'événement dans le fuseau horaire au .

Un bon exemple d'utilisation de DATETIME où TIMESTAMP aurait dû être utilisé est Facebook, où leurs serveurs ne sont jamais tout à fait sûr du temps qui s'est passé entre fuseaux horaires. Une fois, j’ai eu une conversation pendant laquelle le temps a dit que je répondais aux messages avant que le message ne soit réellement envoyé. (Ceci, bien sûr, aurait également pu être causé par une traduction incorrecte du fuseau horaire dans le logiciel de messagerie si les heures avaient été affichées plutôt que synchronisées.)


Les exemples ci-dessous montrent comment le type de date TIMESTAMP modifié les valeurs après avoir time-zone to 'america/new_york'DATETIME est inchangé.

mysql> show variables like '%time_zone%';
+------------------+---------------------+
| Variable_name    | Value               |
+------------------+---------------------+
| system_time_zone | India Standard Time |
| time_zone        | Asia/Calcutta       |
+------------------+---------------------+

mysql> create table datedemo(
    -> mydatetime datetime,
    -> mytimestamp timestamp
    -> );

mysql> insert into datedemo values ((now()),(now()));

mysql> select * from datedemo;
+---------------------+---------------------+
| mydatetime          | mytimestamp         |
+---------------------+---------------------+
| 2011-08-21 14:11:09 | 2011-08-21 14:11:09 |
+---------------------+---------------------+

mysql> set time_zone="america/new_york";

mysql> select * from datedemo;
+---------------------+---------------------+
| mydatetime          | mytimestamp         |
+---------------------+---------------------+
| 2011-08-21 14:11:09 | 2011-08-21 04:41:09 |
+---------------------+---------------------+

J'ai converti ma réponse en article afin que davantage de personnes puissent trouver cela utile, MySQL: Types de données Datetime par rapport à Timestamp .


Les horodatages dans MySQL sont généralement utilisés pour suivre les modifications apportées aux enregistrements et sont souvent mis à jour à chaque modification de l'enregistrement. Si vous souhaitez stocker une valeur spécifique, vous devez utiliser un champ datetime.

Si vous vouliez choisir d'utiliser un horodatage UNIX ou un champ natif de date / heure MySQL, choisissez le format natif. Vous pouvez effectuer des calculs dans MySQL de cette manière ("SELECT DATE_ADD(my_datetime, INTERVAL 1 DAY)") et il est simple de changer le format de la valeur en un horodatage UNIX ("SELECT UNIX_TIMESTAMP(my_datetime)") lorsque vous interrogez l'enregistrement. si vous voulez l'utiliser avec PHP.



TIMESTAMP est toujours en UTC (c'est-à-dire secondes écoulées depuis le 01/01/1970) et votre serveur MySQL le convertit automatiquement en date / heure pour le fuseau horaire du serveur. TIMESTAMP est la solution à long terme, car vous savez que vos données temporelles seront toujours en UTC. Par exemple, vous ne foirez pas vos dates si vous migrez vers un autre serveur ou si vous modifiez les paramètres de fuseau horaire sur votre serveur.


Une autre différence entre Timestamp et Datetime réside dans Timestamp, vous ne pouvez pas attribuer la valeur NULL à la valeur par défaut.


Référence tirée de cet article:

Les principales différences:

TIMESTAMP utilisé pour suivre les modifications apportées aux enregistrements et se mettre à jour chaque fois que l'enregistrement est modifié. DATETIME utilisé pour stocker une valeur spécifique et statique qui n'est pas affectée par les modifications des enregistrements.

TIMESTAMP est également affecté par différents paramètres liés au fuseau horaire. DATETIME est constant.

TIMESTAMP a converti en interne le fuseau horaire actuel en UTC pour le stockage et lors de la récupération, a été reconverti dans le fuseau horaire actuel. DATETIME ne peut pas faire cela.

Plage prise en charge par TIMESTAMP: '1970-01-01 00:00:01 UTC à' 2038-01-19 03:14:07 ′ UTC DATETIME plage prise en charge: '1000-01-01 00:00:00 à' 9999 -12-31 23:59:59 ′


J'aime les horodatages Unix, car vous pouvez convertir en chiffres et vous soucier de ces chiffres. De plus, vous ajoutez / soustrayez et obtenez des durées, etc. Ensuite, convertissez le résultat en Date, quel que soit le format. Ce code recherche le temps en minutes entre un horodatage d'un document et l'heure actuelle.

$date  = $item['pubdate']; (etc ...)
$unix_now = time();
$result = strtotime($date, $unix_now);
$unix_diff_min = (($unix_now  - $result) / 60);
$min = round($unix_diff_min);

J'utilise simplement unsigned BIGINTen stockant UTC ...

qui peut alors encore être ajusté à l'heure locale en PHP.

le DATETIMEà sélectionner avec FROM_UNIXTIME( integer_timestamp_column ).

il faut évidemment placer un index sur cette colonne, sinon il n'y aurait pas d'avance.


La capacité de TIMESTAMP à se mettre à jour automatiquement en fonction de l'heure actuelle sans utiliser de déclencheurs inutiles m'a paru d'une utilité sans pareille. C’est juste moi cependant, bien que TIMESTAMP soit au format UTC, comme il a été dit.

Il peut suivre différentes fuseaux horaires. Par conséquent, si vous devez afficher une heure relative, par exemple, l’heure UTC est celle que vous souhaiteriez.


TIMESTAMP est utile lorsque vous avez des visiteurs de différents pays avec des fuseaux horaires différents. vous pouvez facilement convertir TIMESTAMP en n’importe quel fuseau horaire de pays







sqldatatypes