Datetime vs Timestamp in MySQL e PHP in pratica?


24

Non sono sicuro di come specificare il mio tipo di dati come datetime o timestamp, penso che avrò bisogno di entrambi ma sui diversi eventi. Il mio sito Web vende prodotti e servizi in tutto il mondo e ha anche un sistema di account per l'accesso dell'utente. Si prega di chiarire quanto segue:

  • Data e ora attuali in cui il cliente acquista prodotti dal mio sito Web: Datetime?
  • Data e ora di consegna in base alla loro posizione e data / ora acquistate, calcolate dal nostro sistema: Datetime?
  • L'ultima volta che hanno effettuato l'accesso sul proprio account: Timestamp?

    1. Qual è il codice in php per memorizzare la data di acquisto (data corrente) e quindi memorizzarla nel database?
    2. Per favore, elabora come usare ciascuno di essi poiché dopo aver letto molte spiegazioni su Internet, non riesco ancora a capirlo.

Qualche tempo fa avevo un grande progetto in cui le prestazioni erano un must assoluto, dopo mesi di ricerche abbiamo finito con un timestamp UTC memorizzato in un campo varchar, si è rivelato più veloce e migliore per le nostre esigenze (grande social network)
JasonDavis

Risposte:


29

Timestamp MySQL :

  • Sono memorizzati in UTC

    Vengono convertiti in UTC in memoria e riconvertiti nel fuso orario al momento del recupero. Se si modificano le impostazioni del fuso orario , cambiano anche i valori recuperati.

  • Può essere inizializzato e aggiornato automaticamente

    È possibile impostare il valore predefinito e / o il valore di aggiornamento automatico su CURRENT_TIMESTAMP

  • Avere una serie di 1970-01-01 00:00:01 UTCa2038-01-19 03:14:07 UTC

Considerando MySQL datetime :

  • Ciò che memorizzi è ciò che ottieni ™.

  • Avere una serie di 1000-01-01 00:00:00a9999-12-31 23:59:59

    I valori al di fuori dell'intervallo possono funzionare, ma solo i valori nell'intervallo sono garantiti per funzionare.

  • È possibile memorizzare le date in cui il giorno o il mese è zero.

    Questo è il modo MySQL di archiviare i compleanni! Non puoi farlo con a TIMESTAMP, con l'unica eccezione che è il valore zero di 0000-00-00.

  • Puoi memorizzare date non valide, se necessarie, in modalità ALLOW_INVALID_DATES .

  • È possibile impostare il valore predefinito su NOW()in alcuni casi, ma il modo preferibile e più naturale di date inizializzate e aggiornate automaticamente è TIMESTAMP.

E ovviamente ci sono anche DATEe TIME, che funzionano proprio come DATETIME, ma ovviamente DATEnon si preoccupano del tempo e TIMEnon si preoccupano della data. Tutti e quattro i tipi di dati funzionano perfettamente con l'ampia gamma di funzioni di data e ora , ma quando si mescolano tipi di dati è necessario essere consapevoli degli effetti di conversione .

Ora, alla tua domanda: dovresti usare DATETIMEovunque. Non per motivi tecnici, ma poiché non sei ancora chiaro su come funzioni MySQL, DATETIMEè la scelta più semplice. Ciò significa che dovrai calcolare il timestamp corrente in PHP prima di archiviarlo, è facile come:

$mysqldate = date("Y-m-d H:i:s"); 

La funzione di data di PHP funziona come:

string date ( string $format [, int $timestamp = time() ] )

Il "Y-m-d H:i:s"formato è quello compatibile con MySQL e lasciando vuoto il secondo parametro, date()chiama time()per ottenere l'attuale timestamp UNIX .

L'uso di al TIMESTAMPposto di a DATETIMEha il valore aggiunto di MySQL che assume la responsabilità di decidere il timestamp corrente e puoi saltare il campo quando stai inserendo / aggiornando. Ma poiché stai già inviando una query e il codice per ottenere il timestamp corrente in PHP è minimo, puoi tranquillamente andare con DATETIMEtutto.

Per quanto riguarda il codice effettivo per memorizzare il timestamp PHP nel database, dovresti guardare PHP Data Objects e, se non sei ancora chiaro, chiedi invece su StackOverflow . Ma ci sono già quasi 1.5k domande correlate , assicurati di esaminarle prima di porle. Solo un suggerimento, le dichiarazioni preparate è come lo fanno i ragazzi fighi.


Hmm, potrebbe essere un problema su come inviare la query a MySQL o nella struttura della tabella ... StackOverflow è un posto migliore per questo tipo di problemi, inserisci una domanda lì con la struttura della tabella e il tuo codice php completo, e alcuni dettagli su quale sia il problema e cosa hai già provato. Non discutiamo davvero delle specifiche di implementazione qui ...
yannis,

Grazie per la tua risposta. Ho provato a usare $ mysqldate = date ("Ymd H: i: s"); $ query = INSERT INTO table VALUE ('". $ mysqldate."') sul mio codice php ma verrebbe mantenuto in MySQL come registrazione 00:00:00 in Data (campo) - Datetime (tipo di dati). Intendo memorizzare la data e l'ora correnti. Se imposto il tipo di dati come Timestamp nel database, come codificare in php?
Modulare il

Al momento non sono autorizzato a pubblicare alcun commento su StackOverflow. Sembra un po 'vergognoso, ma è così che mi hanno fatto.
Modulare il

Mi dispiace per quello, ma se sei in modalità di sospensione temporanea ci deve essere una buona ragione. Ora un possibile errore nel codice nel tuo commento è che stai nominando il campo come Date, è una parola riservata per il DATEtipo di dati e potrebbero accadere cose strane (a seconda della versione di MySQL), quindi prova a rinominarlo in qualcosa di simile creationdatee guarda cosa succede . Inoltre, da PHP dovresti trattare i TIMESTAMPcampi allo stesso modo dei DATETIMEcampi, non importa davvero. Il loro formato è lo stesso.
yannis,

Grazie mille. Ora è stato risolto dopo aver trascorso quasi tutta la notte a cercare di capire perché. :)
Modulare il

2

Riferimento tratto da questo articolo:

Le principali differenze:

TIMESTAMP utilizzato per tenere traccia delle modifiche ai record e aggiornarsi ogni volta che il record viene modificato. DATETIME utilizzato per archiviare un valore specifico e statico che non è influenzato da alcuna modifica nei record.

TIMESTAMP è influenzato anche dalle diverse impostazioni relative a TIME ZONE. DATETIME è costante.

TIMESTAMP ha convertito internamente il fuso orario corrente in UTC per l'archiviazione e durante il recupero è stato riconvertito nel fuso orario corrente. DATETIME non può farlo.

Intervallo supportato TIMESTAMP: da '1970-01-01 00:00:01 ′ UTC a' 2038-01-19 03:14:07 ′ DATETIME UTC intervallo supportato: da '1000-01-01 00:00:00 ′ a' 9999 -12-31 23:59:59 ′


1
Quindi, nel 2040, cosa useresti per le modifiche ai record, Timestamp? Non credo.
Bsienn,

-1

Bene, lo guardo in modo molto semplice. Nel tuo caso userei entrambi datetimee timestamp. Con l'utilizzo di entrambi non avrai ulteriori problemi con la memorizzazione dei dati o qualcosa del genere. Un altro campo (colonna) nella tabella non è un grosso problema.

Quindi, dal mio punto di vista ed esperienze finora, di solito uso entrambi. Quando si desidera mostrare una data al visitatore o renderla comprensibile ai visitatori, visualizzare una data in formato datetime.

Il formato datetime potrebbe essere una seccatura quando vuoi calcolare qualcosa (differenza tra 2 date, ottenere la data di ieri dalla data corrente, ottenere 1 settimana fa dalla data corrente, ottenere la data di domani o qualcosa del genere). Non è davvero difficile ma di solito è necessario convertirli timestampe quindi fare le cose. E sì, ad esempio, il datetime attuale si ottiene con: $current = date("Y-m-d");o $current = date("Y-m-d H:i:s");se si desidera anche ore, minuti e secondi.

Il timestamp è solo un numero di 11 cifre che in realtà non "significa" nulla. Quando lo guardi non saprai quale data rappresenta. Quindi non è davvero facile da usare e non puoi usarlo per fare eco e mostrarlo ai tuoi visitatori, ad esempio. Dovrai "trasformarlo" in qualcosa di leggibile. Ma ti offre anche la possibilità di convertirlo facilmente e di calcolare date diverse. Ad esempio, se vuoi ottenere il timestamp per domani nello stesso momento, aggiungi semplicemente il numero di secondi alla data corrente e hai il timestamp di domani. Esempio: $tomorrow = time()+24*3600;puoi anche facilmente ottenere una differenza tra due date in secondi o qualcosa del genere.

Quindi suggerirei di usare sia il datetime che il timestamp. Anche se usi PhpMyadmin per esempio e desideri esaminare rapidamente alcuni dati, sarà più facile per te vedere una data nel formato data e ora (esempio:2011-12-20 10:15:20 :) come lo sarà se guardi solo il numero 11digit. Quindi usa entrambi e poi chiama e usa quello più adatto a te.

Se è necessario o si desidera sceglierne solo uno, suggerirei il timestamp, altrimenti utilizzare entrambi.


1
-1 I Timestamp is just a number 11 digit long which doesn't really "mean" anythingtimestamp di MySQL sono memorizzati nello stesso formato di datetime. Devi convertirli anche in timestamp php, per fare i calcoli che descrivi, O semplicemente usa le molte funzioni di data / ora di MySQL ed esegui i calcoli nel database. La tua risposta non ha davvero senso.
yannis,
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.