Enregistrement de l'horodatage dans la table mysql en utilisant PHP


94

J'ai un champ dans une table MySQL qui a un timestamptype de données. J'enregistre des données dans cette table. Mais lorsque je passe l'horodatage ( 1299762201428) à l'enregistrement, il enregistre automatiquement la valeur 0000-00-00 00:00:00dans cette table.

Comment puis-je stocker l'horodatage dans une table MySQL?

Voici ma INSERTdéclaration:

INSERT INTO table_name (id,d_id,l_id,connection,s_time,upload_items_count,download_items_count,t_time,status)
VALUES (1,5,9,'2',1299762201428,5,10,20,'1'),
       (2,5,9,'2',1299762201428,5,10,20,'1')

1
De quel horodatage parlez-vous? Où l'avez-vous obtenu?
Votre bon sens le

1
pouvez-vous coller la structure de votre table ici?

Réponses:


160

passer comme ça

date('Y-m-d H:i:s','1299762201428')

7
mais la valeur que vous obtenez dans la base de données indique que le type de colonne est datetime, si vous voulez le changer pour timestampensuite changer le type de colonne envarchar(15)
jimy

2
Ensuite, placez-le sur un champ INT. Quoi qu'il en soit, un horodatage n'est qu'une représentation d'une date, et vice versa. Vous pouvez convertir l'horodatage en date avec la fonction que Jimy vous a indiquée, et inversement avec strtotime. edit: btw, horodatage ne couvre qu'une plage de toutes les dates possibles (1970-01-01 à xx-xx-2032 je pense)
Carlos Campderrós

4
Alors, quelle est l'utilisation du type de données horodatage? Le champ s_time a un type de données horodatage. Puis-je enregistrer 1299762201428 dans ce champ?
gautamlakum

@ lakum4stackof: Pour le type de données d'horodatage, veuillez consulter dev.mysql.com/doc/refman/5.0/en/timestamp.html pour plus de détails.
RollingBoy

1
@ lakum4stackof - l'utilisation de l'horodatage consiste à enregistrer l'horodatage, mais il n'est affiché que sous forme de date. En interne (comme tous les types de données), il est stocké sous forme d'entier signé. Si vous souhaitez également formater cet horodatage sous forme d'entier, je vous suggère d'utiliser simplement le champ INT. L'utilisation de la colonne d'horodatage correspond à la manipulation de la date (ajout d'intervalles et autres).
Michael JV

51

Hé là, utilisez la FROM_UNIXTIME()fonction pour cela.

Comme ça:

INSERT INTO table_name
(id,d_id,l_id,connection,s_time,upload_items_count,download_items_count,t_time,status)
VALUES
(1,5,9,'2',FROM_UNIXTIME(1299762201428),5,10,20,'1'), 
(2,5,9,'2',FROM_UNIXTIME(1299762201428),5,10,20,'1')

Pourquoi est-ce mieux que date('Y-m-d H:i:s','1299762201428')?
Yuri

5
Sécurité de type: renvoie un FROM_UNIXTIMEtype de date mysql natif tandis que php date()renvoie une chaîne.
Richard Tuin

5
C'est mieux car le serveur Web (PHP) et MySQL peuvent se trouver à des endroits différents. Ainsi, la date ('Ymd H: i: s', '1299762201428') définira la zone horaire du serveur Web. Avec différents serveurs Web placés dans différentes zones, vous aurez des données incohérentes. Alternativement, dans votre code, vous devez forcer le fuseau horaire de l'application au fuseau horaire de MySQL. date_timezone_set
Ostico

18
$created_date = date("Y-m-d H:i:s");
$sql = "INSERT INTO $tbl_name(created_date)VALUES('$created_date')";
$result = mysql_query($sql);

15

Quelques points à clarifier:

  • Le type de champ d'horodatage MySQL ne stocke pas les horodatages unix mais plutôt une valeur de type datetime.
  • L'horodatage UNIX est un nombre de type int régulier.
  • L'horodatage dont vous parlez n'est pas un horodatage Unix régulier mais un horodatage en millisecondes.

donc la bonne réponse serait

$timestamp = '1299762201428';
$date = date('Y-m-d H:i:s', substr($timestamp, 0, -3));

3

Le type de données « bigint unsigned » peut répondre à cette exigence.


2

Je suppose que le champ dans lequel vous essayez d'enregistrer la valeur est un champ datetime, ce n'est pas le cas, mais la même chose semble être vraie pour les horodatages . Si c'est le cas, mysql s'attend à ce que le format soit Année-mois-jour Heure: minute: seconde. Pour enregistrer l'horodatage, vous devrez convertir le champ en numérique à l'aide d'une requête telle que

alter table <table_name> change <field> <field> bigint unsigned

Si vous utilisez l'heure actuelle, vous pouvez utiliser now () ou current_timestamp.


2

Vous pouvez également utiliser now()dans votre requête, c'est-à-dire:

insert into table (time) values(now());

Il utilisera l'horodatage actuel.


1

Utilisation FROM_UNIXTIME() .

Remarque: 1299762201428 ressemble plus à un horodatage en millisecondes (comme Date () * 1 en JavaScript), et vous devez probablement le diviser par 1000.


1

Vérifiez le type de champ dans la table, enregistrez simplement la valeur de l'horodatage dans le type de données, comme bigintetc.

Pas de datetimetype



0

Si l'horodatage est l'heure actuelle, vous pouvez utiliser la NOW()fonction mysql


0

Utilisez datetimele type de champ. Il présente de nombreux avantages comme la lisibilité humaine (personne ne lit les horodatages) et les fonctions MySQL .

Pour convertir à partir d'un horodatage unix, vous pouvez utiliser la fonction MySQL FROM_UNIXTIME(1299762201428). Pour reconvertir , vous pouvez utiliser UNIX_TIMESTAMP: SELECT UNIX_TIMESTAMP(t_time) FROM table_name.

Bien sûr, si vous ne faites pas comme fonction MySQL, vous pouvez toujours utiliser PHP: 'INSERT INTO table_name SET t_time = ' . date('Y-m-d H:i:s', $unix_timestamp).


Le timestamp type de champ est également lisible par l'homme (lors de l'utilisation SELECTdans la console). Ils sont très différents et ont tous deux leurs inconvénients. La principale différence réside dans la manière dont les fuseaux horaires sont gérés.
Udo G

@Udo G: Vous avez raison, mais je préfère toujours datetimepour diverses raisons. Quel est le plus gros dés / avantage à votre avis?
Znarkus

le plus grand avantage pour timestamp: il correspond mieux aux horodatages PHP car il est immunisé contre les paramètres de fuseau horaire du serveur et du client, alors datetimeque la valeur affichée change en fonction du fuseau horaire de votre client MySQL (bien sûr cela dépend de votre projet, qui on est mieux). le plus gros inconvénient pour timestamp: il ne supporte pas les valeurs NULL et (je ne sais pas ce qu'ils ont fumé quand ils ont programmé cela) un TIMESTAMP NOT NULLchamp devient un TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP. Dans mon cas, je dois malheureusement utiliser TIMESTAMPpour des raisons TZ.
Udo G

0

Mieux vaut utiliser le type de données varchar(15).


3
Enregistrer un nombre sous forme de chaîne n'est généralement pas une bonne pratique, car les chaînes sont plus lentes en comparaison et plus difficiles à calculer.
RollingBoy

Mon vote va à un int non signé - mais allons dans le terrier du lapin. Pourquoi varchar et pas char? C'est une entrée de longueur fixe - micro-optimisation, mais quand même ...
BradChesney79


-1

Si je sais que la base de données est MySQL, j'utiliserai la fonction NOW () comme ceci:

INSERT INTO table_name
   (id, name, created_at) 
VALUES 
   (1, 'Gordon', NOW()) 

Cela stockerait uniquement l'horodatage actuel, pas strictement ce que OP demande.
charliefortune
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.