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')

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')

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')

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);

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));

3

Der Datentyp ' bigint unsigned ' kann dieser Anforderung entsprechen.


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.


2

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

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

Es wird der aktuelle Zeitstempel verwendet.


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.


1

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

Nicht datetimetippen



0

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


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).


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).


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


-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()) 

Dies würde nur den aktuellen Zeitstempel speichern, nicht genau das, was OP verlangt.
Charlie Fortune
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.