Salvataggio del timestamp nella tabella mysql utilizzando php


94

Ho un campo in una tabella MySQL che ha un timestamptipo di dati. Sto salvando i dati in quella tabella. Ma quando passo il timestamp ( 1299762201428) al record, salva automaticamente il valore 0000-00-00 00:00:00in quella tabella.

Come posso memorizzare il timestamp in una tabella MySQL?

Ecco la mia INSERTdichiarazione:

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
Di quale data e ora stai parlando? Dove l'hai preso?
Il tuo buon senso

1
puoi incollare la struttura del tuo tavolo qui?

Risposte:


160

passare così

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

7
ma il valore che ottieni in db mostra che il tipo di colonna è datetime, se vuoi cambiarlo per timestamppoi cambiare il tipo di colonna invarchar(15)
jimy

2
Quindi inseriscilo in un campo INT. Ad ogni modo, un timestamp è solo una rappresentazione di una data e viceversa. Puoi convertire da timestamp a data con la funzione che ti ha detto jimy e viceversa con strtotime. modifica: btw, timestamp copre solo un intervallo di tutte le date possibili (1970-01-01 a xx-xx-2032 credo)
Carlos Campderrós

4
quindi qual è l'uso del tipo di dati timestamp? Il campo s_time ha un tipo di dati timestamp. Non posso salvare 1299762201428 in quel campo?
gautamlakum

@ lakum4stackof: per il tipo di dati timestamp, fare riferimento a dev.mysql.com/doc/refman/5.0/en/timestamp.html per i dettagli.
RollingBoy

1
@ lakum4stackof - l'uso del timestamp è che salvi il timestamp, ma viene visualizzato solo come data. Internamente (come tutti i tipi di dati) è archiviato come intero con segno. Se vuoi anche formattare quel timestamp come numero intero, ti suggerisco di usare il campo INT allora. L'utilizzo della colonna timestamp è la manipolazione della data (aggiunta di intervalli e simili).
Michael JV

51

Ehi, usa la FROM_UNIXTIME()funzione per questo.

Come questo:

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

Perché questo è meglio di date('Y-m-d H:i:s','1299762201428')?
Yuri

5
Sicurezza dei tipi: FROM_UNIXTIMErestituisce un tipo di data mysql nativo mentre php date()restituisce una stringa.
Richard Tuin

5
È meglio perché il server web (PHP) e MySQL potrebbero trovarsi in posti diversi. Quindi, la data ('Ymd H: i: s', '1299762201428') imposterà il fuso orario del server web. Con diversi server web collocati in zone differenti avrai dati incoerenti. In alternativa, nel tuo codice, devi forzare il fuso orario dell'applicazione al fuso orario di 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

Alcune cose da chiarire:

  • Il tipo di campo timestamp MySQL non memorizza timestamp unix ma piuttosto un valore di tipo datetime.
  • Il timestamp di UNIX è un numero di un normale tipo int.
  • Il timestamp di cui stai parlando non è un normale unix timestamp ma un timestamp con millisecondi.

quindi la risposta corretta sarebbe

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

3

Il tipo di dati " bigint unsigned " può soddisfare questo requisito.


2

Immagino che il campo in cui stai cercando di salvare il valore sia un campo data / ora, ma lo stesso sembra essere vero per i timestamp . Se è così, mysql si aspetta che il formato sia Anno-mese-giorno Ora: minuto: secondo. Per salvare il timestamp dovrai convertire il campo in numerico usando una query come

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

Se stai usando l'ora corrente puoi usare now () o current_timestamp.


2

Puoi anche utilizzare now()nella tua query, ad esempio:

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

Utilizzerà il timestamp corrente.


1

Uso FROM_UNIXTIME() .

Nota: 1299762201428 assomiglia più a un timestamp in millisecondi (come Date () * 1 in JavaScript) e probabilmente devi dividerlo per 1000.


1

Controlla il tipo di campo nella tabella solo salva il valore del timestamp nel tipo di dati come bigintecc.

Non datetimedigitare



0

Se il timestamp è l'ora corrente, è possibile utilizzare la NOW()funzione mysql


0

Usa datetimetipo di campo. Viene fornito con molti vantaggi come la leggibilità umana (nessuno legge i timestamp) e le funzioni MySQL .

Per convertire da un timestamp unix, puoi utilizzare la funzione MySQL FROM_UNIXTIME(1299762201428). Per convertire indietro è possibile utilizzare UNIX_TIMESTAMP: SELECT UNIX_TIMESTAMP(t_time) FROM table_name.

Naturalmente, se non ti piace la funzione di MySQL, si può sempre utilizzare PHP: 'INSERT INTO table_name SET t_time = ' . date('Y-m-d H:i:s', $unix_timestamp).


Anche il timestamp tipo di campo è leggibile dall'uomo (se utilizzato SELECTnella console). Sono molto diversi ed entrambi hanno i loro svantaggi. La differenza principale è il modo in cui vengono gestiti i fusi orari.
Udo G

@Udo G: hai ragione, ma continuo a preferire datetimeper vari motivi. Qual è il più grande svantaggio secondo te?
Znarkus

il più grande vantaggio per timestamp: corrisponde meglio ai timestamp PHP poiché è immune alle impostazioni del fuso orario sia del server che del client, mentre datetimecambia il valore visualizzato a seconda del fuso orario del tuo client MySQL (ovviamente dipende dal tuo progetto, che uno è meglio). il più grande svantaggio per timestamp: non supporta i valori NULL e (non so cosa hanno fumato quando l'hanno programmato) un TIMESTAMP NOT NULLcampo diventa un TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP. Nel mio caso ho purtroppo bisogno di utilizzare TIMESTAMPper ragioni TZ.
Udo G

0

È meglio usare il tipo di dati varchar(15).


3
Salvare un numero sotto forma di stringa di solito non è una buona pratica, poiché le stringhe sono più lente in confronto e più difficili da eseguire calcoli.
RollingBoy

Il mio voto va a unsigned int-- ma andiamo nella tana del coniglio. Perché varchar e non char? È una voce a lunghezza fissa - micro-ottimizzazione, ma comunque ...
BradChesney79


-1

Se so che il database è MySQL, userò la funzione NOW () in questo modo:

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

Ciò memorizzerebbe solo il timestamp corrente, non strettamente quello che richiede OP.
charliefortune
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.