Speichern des Zeitstempels in der MySQL-Tabelle mit PHP

94

Ich habe ein Feld in einer MySQL-Tabelle, das einen timestampDatentyp hat. Ich speichere Daten in dieser Tabelle. Wenn ich jedoch den Zeitstempel ( 1299762201428) an den Datensatz übergebe, wird der Wert automatisch 0000-00-00 00:00:00in dieser Tabelle gespeichert.

Wie kann ich den Zeitstempel in einer MySQL-Tabelle speichern?

Hier ist meine INSERTAussage:

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')
Gautamlakum
quelle
1
Über welchen Zeitstempel sprechen Sie? Wo hast du es her?
Ihr gesunder Menschenverstand
1
Kannst du deine Tabellenstruktur hier einfügen?

Antworten:

160

pass so

date('Y-m-d H:i:s','1299762201428')
Jimy
quelle
7
Aber der Wert, den Sie in db erhalten, zeigt den datetimetimestampvarchar(15)
Spaltentyp an
2
Dann legen Sie es auf ein INT-Feld. Auf jeden Fall ist ein Zeitstempel nur eine Darstellung eines Datums und umgekehrt. Sie können mit der Funktion, die Jimy Ihnen mitgeteilt hat, vom Zeitstempel zum Datum konvertieren und umgekehrt mit strtotime. edit: Übrigens, der Zeitstempel deckt nur einen Bereich aller möglichen Daten ab (1970-01-01 bis xx-xx-2032, glaube ich)
Carlos Campderrós
4
Was ist die Verwendung des Zeitstempeldatentyps? Das Feld s_time hat den Datentyp Zeitstempel. Kann ich 1299762201428 nicht in diesem Feld speichern?
Gautamlakum
@ lakum4stackof: Einzelheiten zum Datentyp des Zeitstempels finden Sie unter dev.mysql.com/doc/refman/5.0/en/timestamp.html .
RollingBoy
1
@ lakum4stackof - Die Verwendung des Zeitstempels besteht darin, dass Sie den Zeitstempel speichern, dieser jedoch nur als Datum angezeigt wird. Intern (wie alle Datentypen) wird es als vorzeichenbehaftete Ganzzahl gespeichert. Wenn Sie diesen Zeitstempel auch als Ganzzahl formatieren möchten, empfehle ich, dass Sie dann nur das Feld INT verwenden. Die Verwendung der Zeitstempelspalte ist die Datumsmanpipulation (Hinzufügen von Intervallen und dergleichen).
Michael JV
51

Hey, benutze die FROM_UNIXTIME()Funktion dafür.

So was:

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')
Richard Tuin
quelle
Warum ist das besser als date('Y-m-d H:i:s','1299762201428')?
Yuri
5
Typensicherheit: FROM_UNIXTIMEGibt einen nativen MySQL-Datumstyp aus, während PHPs date()einen String zurückgeben.
Richard Tuin
5
Es ist besser, weil sich Webserver (PHP) und MySQL an verschiedenen Orten befinden können. Das Datum ('Ymd H: i: s', '1299762201428') legt also die Zeitzone des Webservers fest. Mit verschiedenen Webservern in verschiedenen Zonen haben Sie inkonsistente Daten. Alternativ müssen Sie in Ihrem Code die Zeitzone der Anwendung auf die Zeitzone von MySQL zwingen. 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);
Tushar Kumar Kundan
quelle
15

Einige Dinge zu klären:

  • Der Feldtyp MySQL-Zeitstempel speichert keine Unix-Zeitstempel, sondern einen Wert vom Typ Datum / Uhrzeit.
  • UNIX-Zeitstempel ist eine Nummer eines regulären int-Typs.
  • Der Zeitstempel, über den Sie sprechen, ist kein regulärer Unix-Zeitstempel, sondern ein Zeitstempel mit Millisekunden.

daher wäre die richtige Antwort

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

Der Datentyp ' bigint unsigned ' kann dieser Anforderung entsprechen.

RollingBoy
quelle
2

Ich vermute, dass das Feld, in dem Sie den Wert speichern möchten, ein Datum / Uhrzeit-Feld ist, das es nicht ist, aber das gleiche scheint für Zeitstempel zu gelten . Wenn ja, erwartet MySQL, dass das Format Jahr-Monat-Tag Stunde: Minute: Sekunde ist. Um den Zeitstempel zu speichern, müssen Sie das Feld mit einer Abfrage wie in numerisch konvertieren

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

Wenn Sie die aktuelle Uhrzeit verwenden, können Sie now () oder current_timestamp verwenden.

Belinda
quelle
2

Sie können now()auch in Ihrer Abfrage verwenden, dh:

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

Es wird der aktuelle Zeitstempel verwendet.

Masood Moshref
quelle
1

Verwenden FROM_UNIXTIME() .

Hinweis: 1299762201428 ähnelt eher einem Millisekunden-Zeitstempel (wie Date () * 1 in JavaScript), und Sie müssen diesen wahrscheinlich durch 1000 teilen.

Udo G.
quelle
1

Überprüfen Sie den Feldtyp in der Tabelle und speichern Sie den Zeitstempelwert im Datentyp wie bigintusw.

Nicht datetimetippen


quelle
1

Dies sollte es tun:

  $time = new DateTime; 
misaizdaleka
quelle
0

Wenn der Zeitstempel die aktuelle Zeit ist, können Sie die MySQL- NOW()Funktion verwenden

ipsum
quelle
0

Feldtyp datetimeverwenden. Es bietet viele Vorteile wie die Lesbarkeit durch den Menschen (niemand liest Zeitstempel) und MySQL-Funktionen .

Um von einem Unix-Zeitstempel zu konvertieren, können Sie die MySQL-Funktion verwenden FROM_UNIXTIME(1299762201428). Zum Zurückkonvertieren können Sie verwenden UNIX_TIMESTAMP: SELECT UNIX_TIMESTAMP(t_time) FROM table_name.

Wenn Sie die MySQL-Funktion nicht mögen, können Sie natürlich immer PHP verwenden : 'INSERT INTO table_name SET t_time = ' . date('Y-m-d H:i:s', $unix_timestamp).

Znarkus
quelle
Der timestamp Feldtyp ist auch für Menschen lesbar (bei Verwendung SELECTin der Konsole). Sie sind sehr unterschiedlich und beide haben ihre Nachteile. Der Hauptunterschied besteht darin, wie Zeitzonen behandelt werden.
Udo G
@Udo G: Sie haben Recht, aber ich bevorzuge immer noch datetimeaus verschiedenen Gründen. Was ist Ihrer Meinung nach der größte Nachteil?
Znarkus
Der größte Vorteil für timestamp: Es passt besser zu den PHP-Zeitstempeln, da es gegen die Zeitzoneneinstellungen sowohl des Servers als auch des Clients immun ist, während datetimesich der angezeigte Wert abhängig von der Zeitzone Ihres MySQL-Clients ändert (natürlich hängt es von Ihrem Projekt ab, welches man ist besser). größter Nachteil für timestamp: Es werden keine NULL-Werte unterstützt und (ich weiß nicht, was sie geraucht haben, als sie dies programmiert haben) ein TIMESTAMP NOT NULLFeld wird zu einem TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP. In meinem Fall habe ich leider müssen verwenden TIMESTAMPfür TZ Gründen.
Udo G
0

Besser ist der Datentyp varchar(15).

Gautamlakum
quelle
3
Das Speichern einer Zahl in Form einer Zeichenfolge ist normalerweise keine gute Übung, da Zeichenfolgen im Vergleich langsamer und schwieriger zu berechnen sind.
RollingBoy
Meine Stimme geht an unsigned int-- aber lass uns das Kaninchenloch runter gehen. Warum varchar und nicht char? Es ist ein Eintrag mit fester Länge - Mikrooptimierung, aber immer noch ...
BradChesney79
0

Sie können tun : $date = \gmdate(\DATE_ISO8601);.

HelpNeeder
quelle
-1

Wenn ich weiß, dass die Datenbank MySQL ist, verwende ich die NOW () - Funktion wie folgt:

INSERT INTO table_name
   (id, name, created_at) 
VALUES 
   (1, 'Gordon', NOW()) 
Jannie Theunissen
quelle
Dies würde nur den aktuellen Zeitstempel speichern, nicht genau das, was OP verlangt.
Charlie Fortune