Converti data e ora fino alla query MySQL


188

Voglio convertire un timestampin MySQL in una data.

Vorrei formattare il campo user.registration nel file di testo come a yyyy-mm-dd.

Ecco il mio SQL:

$sql = requestSQL("SELECT user.email, 
                   info.name, 
                   FROM_UNIXTIME(user.registration),
                   info.news
                   FROM user, info 
                   WHERE user.id = info.id ", "export members");

Ho anche provato la conversione della data con:

DATE_FORMAT(user.registration, '%d/%m/%Y')
DATE(user.registration)

Ripeto il risultato prima di scrivere il file di testo e ottengo:

email1; nome1; DATE_FORMAT (registrazione utente, '% d /% m /% Y'); notizie1

email2; nome2; news2

Come posso convertire quel campo fino ad oggi?


Sta salvando il file esattamente così? Qual è il codice che stai usando per eseguire la query sql?
seanbreeden,

1
Ho modificato la mia domanda, requeteSQL esegue la query
remyremy,

Risposte:


373
DATE_FORMAT(FROM_UNIXTIME(`user.registration`), '%e %b %Y') AS 'date_formatted'

2
A partire da MySQL 5.6.23, trovo che il valore di FROM_UNIXTIME () debba essere inserito direttamente: ovvero, DATE_FORMAT (FROM_UNIXTIME (user.registration), '% e% b% Y') AS 'date_formatted'
JESii

SELEZIONA * DA utenti DOVE DATE_FORMAT (FROM_UNIXTIME ( users. user_created_at), '% Y-% b-% e') = '2015-03-06' è questo formato corretto o devo modificarlo?
Dheeraj Thedijje,

2
@DheerajThedijje questo si presenta come 2018-Nov-6. Potresti cercare '%Y-%m-%d'come lo formatteresti in PHP (date('Y-m-d',$row->user_created_at))- questo (entrambe le varianti, SQL e PHP) si presenta come 06-11-2018
Chris S.

Nel caso in cui si desideri aggiungere l'ora in questo modo "hh: mm: ss", aggiungere questo alla stringa di formato '% H:% i:% s'
luis.ap.uyen

64

Convertire il timestamp fino ad oggi in MYSQL

Crea la tabella con un timestamp intero:

mysql> create table foo(id INT, mytimestamp INT(11));
Query OK, 0 rows affected (0.02 sec)

Inserisci alcuni valori

mysql> insert into foo values(1, 1381262848);
Query OK, 1 row affected (0.01 sec)

Guarda

mysql> select * from foo;
+------+-------------+
| id   | mytimestamp |
+------+-------------+
|    1 |  1381262848 |
+------+-------------+
1 row in set (0.00 sec)

Convertire il numero in un timestamp:

mysql> select id, from_unixtime(mytimestamp) from foo;
+------+----------------------------+
| id   | from_unixtime(mytimestamp) |
+------+----------------------------+
|    1 | 2013-10-08 16:07:28        |
+------+----------------------------+
1 row in set (0.00 sec)

Converti in un formato leggibile:

mysql> select id, from_unixtime(mytimestamp, '%Y %D %M %H:%i:%s') from foo;
+------+-------------------------------------------------+
| id   | from_unixtime(mytimestamp, '%Y %D %M %H:%i:%s') |
+------+-------------------------------------------------+
|    1 | 2013 8th October 04:07:28                       |
+------+-------------------------------------------------+
1 row in set (0.00 sec)

correggi da% h a% H
Tomot

61

Per avere un appuntamento, puoi castfarlo

cast(user.registration as date)

e per ottenere un formato specifico utilizzare date_format

date_format(registration, '%Y-%m-%d')

Demo di SQLFiddle


Dà lo stesso risultato, viene visualizzato il cast (user.registration come data) invece del valore del campo
remyremy,

5
Questo ha funzionato però - cast (from_unixtime (user.registration) AS data)
Eric Ness

ho un formato di data specifico che ha funzionato per me il più possibile grazie
sabre tabatabaee yazdi

usa "come DATETIME" per ottenere anche minuti e secondi
Enrique

Penso che questa risposta sia la soluzione breve e chiara. Preferisco questo.
Roman Matveev,

18

Se il registrationcampo è effettivamente di tipo TIMESTAMPdovresti essere in grado di fare solo:

$sql = "SELECT user.email, 
           info.name, 
           DATE(user.registration), 
           info.news
      FROM user, 
           info 
     WHERE user.id = info.id ";

e la registrazione dovrebbe essere visualizzata come aaaa-mm-gg


Ho provato ma ottengo lo stesso risultato: DATE (user.registration) viene visualizzato al posto del valore del campo
remyremy,

come qualcuno ha suggerito, sei in grado di eseguire correttamente la query utilizzando direttamente il client mysql? Non ho sentito parlare della funzione requeteSQL, che cosa fa esattamente?
cs0lar,

Sfortunatamente non sono in grado di utilizzare direttamente un client mysql, non ho il mio server ... Ho fornito requeteSQL, fondamentalmente esegue solo la query e verifica se l'errore di inviare e-mail ...
remyremy

2
In realtà mi sono reso conto che il mio campo era un tipo GRANDE e non un TIMESTAMP. Solo il contenuto era un timestamp (1328649722), quindi è per questo che non ha funzionato. Ora va tutto bene con FROM_UNIXTIME!
Remyremy,

Questo lavoro bene l'ho provato con datetime in quanto avevo bisogno di ottenere solo la parte della data.
Ericsicons,

10

Basta usare la funzione DATA di mysql:

mysql> select DATE(mytimestamp) from foo;

5
SELECT DATE(UNIX_TIMESTAMP())sputa NULLnel mio MySQL 5.7.14
Xenos l'

provare DATE (CURRENT_TIMESTAMP ())
Morey il

7

Dovresti convertirlo timestampin date.

select FROM_UNIXTIME(user.registration, '%Y-%m-%d %H:%i:%s') AS 'date_formatted'

FROM_UNIXTIME


2

Se stai ricevendo la query nel tuo output, devi mostrarci il codice che rispecchia effettivamente il risultato. Puoi pubblicare il codice che chiama requeteSQL?

Ad esempio, se hai utilizzato virgolette singole in php, verrà stampato il nome della variabile, non il valore

echo 'foo is $foo'; // foo is $foo

Questo suona esattamente come il tuo problema e sono sicuro che questa sia la causa.

Inoltre, prova a rimuovere il simbolo @ per vedere se ciò ti aiuta dando più informazioni.

così che

$SQL_result = @mysql_query($SQL_requete); // run the query

diventa

  $SQL_result = mysql_query($SQL_requete); // run the query

Ciò interromperà la soppressione degli errori se la query genera un errore.


2

L'ho fatto con la funzione 'data' come descritto qui :

(SELECT count(*) as the-counts,(date(timestamp)) as the-timestamps FROM `user_data` WHERE 1 group BY the-timestamps)

2

FROM_UNIXTIME(unix_timestamp, [format]) é tutto quello di cui hai bisogno

FROM_UNIXTIME(user.registration, '%Y-%m-%d') AS 'date_formatted'

FROM_UNIXTIMEottiene un valore numerico e lo trasforma in un DATEoggetto
oppure , se gli viene fornita una stringa di formato, lo restituisce come stringa.

La soluzione precedente era quella di ottenere l'oggetto data iniziale e formattarlo con una seconda funzione DATE_FORMAT... ma questo non è più necessario


1

Provare:

SELECT strftime("%Y-%d-%m", col_name, 'unixepoch') AS col_name

Formatterà il timestamp in millisecondi in stringa aaaa-mm-gg.

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.