Converter carimbo de data / hora para data na consulta MySQL

188

Eu quero converter um timestampno MySQL para uma data.

Gostaria de formatar o campo user.registration no arquivo de texto como a yyyy-mm-dd.

Aqui está o meu SQL:

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

Eu também tentei a conversão de data com:

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

Repito o resultado antes para escrever o arquivo de texto e recebo:

email1; nome1; DATE_FORMAT (registro do usuário, '% d /% m /% Y'); notícias1

email2; nome2; notícias2

Como posso converter esse campo para data?

remyremy
fonte
Está salvando o arquivo exatamente assim? Qual é o código que você está usando para executar a consulta sql?
Seanbreeden
1
Eu editei a minha pergunta, requeteSQL está executando a consulta
remyremy

Respostas:

373
DATE_FORMAT(FROM_UNIXTIME(`user.registration`), '%e %b %Y') AS 'date_formatted'
Yatin
fonte
2
No MySQL 5.6.23, acho que o valor para FROM_UNIXTIME () deve ser inserido diretamente: ou seja, DATE_FORMAT (FROM_UNIXTIME (user.registration), '% e% b% Y') AS 'date_formatted'
JESii
SELECT * FROM usuários WHERE DATE_FORMAT (FROM_UNIXTIME ( users. user_created_at), '% Y-% b-% e') = '2015-03-06' é este formato correto ou devo modificá-lo?
Dheeraj Thedijje 7/0318
2
@DheerajThedijje isso aparece como 6 de novembro de 2018. Você pode estar procurando '%Y-%m-%d'como seria de formatá-lo em PHP (date('Y-m-d',$row->user_created_at))- este (ambas as variantes, SQL e PHP) mostra-se como 2018/11/06
Chris S.
Caso você queira adicionar a hora dessa maneira "hh: mm: ss", adicione-a à string de formato '% H:% i:% s'
luis.ap.uyen
64

Converter carimbo de data / hora para data no MYSQL

Crie a tabela com um carimbo de data / hora inteiro:

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

Inserir alguns valores

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

Dê uma olhada

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

Converta o número em um carimbo de data / hora:

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)

Converta-o em um formato legível:

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)
Eric Leschinski
fonte
corrija% h a% H
Tomot 14/02/19
61

Apenas para obter uma data que puder castlo

cast(user.registration as date)

e para obter um formato específico, use date_format

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

Demonstração do SQLFiddle

juergen d
fonte
Ele dá o mesmo resultado, cast (user.registration como data) é exibido em vez do valor do campo
remyremy
5
Porém, isso funcionou - elenco (from_unixtime (user.registration) AS date)
Eric Ness
i tem formato de data específica que seu trabalhou para mim, bem como possíveis graças
sabre tabatabaee Yazdi
usar "como DATETIME" para obter minutos hora e segundos demasiado
Enrique
Penso que esta resposta é a solução curta e clara. Eu prefiro isso.
Roman Matveev
18

Se o registrationcampo for realmente do tipo, TIMESTAMPvocê poderá:

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

e o registro deve aparecer como aaaa-mm-dd

cs0lar
fonte
Eu tentei, mas eu obter o mesmo resultado: DATE (user.registration) é exibição em vez do valor do campo
remyremy
como alguém sugeriu, você pode executar a consulta com sucesso usando o cliente mysql diretamente? Não ouvi falar da função requeteSQL, o que exatamente ela faz?
cs0lar
Infelizmente não consigo usar um cliente mysql diretamente, não tenho meu próprio servidor ... forneci o requeteSQL, basicamente ele apenas executa a consulta e testa se há erro ao enviar e-mails ...
remyremy
2
Na verdade, percebi que meu campo era do tipo BIGINT e não do TIMESTAMP. Somente o conteúdo era um carimbo de data / hora (1328649722), por isso não funcionou. Agora está tudo bem com FROM_UNIXTIME!
Remyremy
Esse trabalho foi bom, tentei com datetime, pois precisava obter apenas a parte da data.
Ericsicons
10

Apenas use a função DATA do mysql:

mysql> select DATE(mytimestamp) from foo;
Morey
fonte
5
SELECT DATE(UNIX_TIMESTAMP())espetos NULLem minha MySQL 5.7.14
Xenos
tente DATE (CURRENT_TIMESTAMP ())
Morey
7

Você deve converter timestamppara date.

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

FROM_UNIXTIME

Jaydeep Mor
fonte
2

Se você estiver recebendo a consulta em sua saída, precisará nos mostrar o código que realmente faz eco do resultado. Você pode postar o código que chama requeteSQL?

Por exemplo, se você usou aspas simples no php, ele imprimirá o nome da variável, não o valor

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

Isso soa exatamente como o seu problema e estou certo de que essa é a causa.

Além disso, tente remover o símbolo @ para ver se isso ajuda, fornecendo mais informações.

de modo a

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

torna-se

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

Isso interromperá a supressão de erro se a consulta estiver gerando um erro.

Fraser
fonte
2

Eu fiz isso com a função 'date', conforme descrito aqui :

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

FROM_UNIXTIME(unix_timestamp, [format]) é tudo o que você precisa

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

FROM_UNIXTIMEobtém um valor numérico e o transforma em um DATEobjeto,
ou se receber uma string de formato, ele retornará como uma string.

A solução mais antiga era obter o objeto de data inicial e formatá-lo com uma segunda função DATE_FORMAT... mas isso não é mais necessário

d.raev
fonte
1

Experimentar:

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

Formatará o registro de data e hora em milissegundos para a sequência aaaa-mm-dd.

Vitaliy A
fonte