Salvando carimbo de data / hora na tabela mysql usando php

94

Eu tenho um campo em uma tabela MySQL que possui um timestamptipo de dados. Estou salvando dados nessa tabela. Mas quando passo o carimbo de data / hora ( 1299762201428) para o registro, ele salva automaticamente o valor 0000-00-00 00:00:00nessa tabela.

Como posso armazenar o carimbo de data / hora em uma tabela MySQL?

Aqui está minha INSERTdeclaração:

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')
gautamlakum
fonte
1
De que data e hora você está falando? Onde você conseguiu isso?
Seu senso comum
1
você pode colar a estrutura da tabela aqui?

Respostas:

160

passar assim

date('Y-m-d H:i:s','1299762201428')
Jimy
fonte
7
mas o valor que você obtém em db mostra que o tipo de coluna é datetime, se você quiser alterá-lo para timestamp, altere o tipo de coluna paravarchar(15)
jimy
2
Em seguida, coloque-o em um campo INT. De qualquer forma, um timestamp é apenas uma representação de uma data e vice-versa. Você pode converter de carimbo de data / hora em data com a função que jimy disse a você e da outra forma com strtotime. editar: btw, timestamp cobre apenas um intervalo de todas as datas possíveis (1970-01-01 a xx-xx-2032 eu acho)
Carlos Campderrós
4
então qual é o uso do tipo de dados timestamp? O campo s_time tem tipo de dados de carimbo de data / hora. Não posso salvar 1299762201428 nesse campo?
gautamlakum
@ lakum4stackof: Para o tipo de dados de carimbo de data / hora, consulte dev.mysql.com/doc/refman/5.0/en/timestamp.html para obter detalhes.
RollingBoy
1
@ lakum4stackof - o uso de carimbo de data / hora é que você salva o carimbo de data / hora, mas é exibido apenas como uma data. Internamente (como todos os tipos de dados) é armazenado como inteiro assinado. Se você também quiser formatar esse carimbo de data / hora como um inteiro, sugiro que você use o campo INT. O uso da coluna timestamp é a manipulação da data (incluindo intervalos e outros).
Michael JV
51

Olá, use a FROM_UNIXTIME()função para isso.

Como isso:

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')
Richard Tuin
fonte
Por que isso é melhor do que date('Y-m-d H:i:s','1299762201428')?
Yuri de
5
Segurança de tipo: FROM_UNIXTIMEproduz um tipo de data mysql nativo enquanto php date()retorna uma string.
Richard Tuin
5
É melhor porque o servidor web (PHP) e o MySQL podem estar em lugares diferentes. Portanto, data ('Ymd H: i: s', '1299762201428') definirá o fuso horário do servidor web. Com diferentes servidores da web colocados em diferentes zonas, você terá dados inconsistentes. Como alternativa, em seu código, você deve forçar o fuso horário do aplicativo para o fuso horário do 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);
Tushar Kumar Kundan
fonte
15

Algumas coisas para esclarecer:

  • O tipo de campo de carimbo de data / hora do MySQL não armazena carimbos de data / hora unix, mas sim um valor do tipo datetime.
  • O carimbo de data / hora UNIX é um número de um tipo normal de int.
  • O carimbo de data / hora de que você está falando não é um carimbo de data / hora unix regular, mas um carimbo de data / hora com milissegundos.

portanto, a resposta correta seria

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

O tipo de dados ' bigint unsigned ' pode atender a esse requisito.

RollingBoy
fonte
2

Estou supondo que o campo no qual você está tentando salvar o valor é um campo de data e hora , mas não é, mas o mesmo parece ser verdadeiro para carimbos de data / hora . Nesse caso, o mysql espera que o formato seja Ano-mês-dia Hora: minuto: segundo. Para salvar o carimbo de data / hora, você terá que converter o campo para numérico usando uma consulta como

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

Se você estiver usando a hora atual, você pode usar now () ou current_timestamp.

Belinda
fonte
2

Você também pode usar now()em sua consulta, ou seja:

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

Ele usará o carimbo de data / hora atual.

Masood Moshref
fonte
1

Use FROM_UNIXTIME().

Nota: 1299762201428 se parece mais com um carimbo de data e hora em milissegundos (como Date () * 1 em JavaScript) e você provavelmente terá que dividir isso por 1000.

Udo G
fonte
1

Verifique o tipo de campo na tabela, basta salvar o valor do carimbo de data / hora no tipo de dados, bigintetc.

Não datetimetipo


fonte
1

Isso deve servir:

  $time = new DateTime; 
Misaizdaleka
fonte
0

Se o carimbo de data / hora for a hora atual, você pode usar a NOW()função mysql

ipsum
fonte
0

Use o datetimetipo de campo. Ele vem com muitas vantagens, como legibilidade humana (ninguém lê timestamps) e funções do MySQL .

Para converter de um carimbo de data / hora Unix, você pode usar a função MySQL FROM_UNIXTIME(1299762201428). Para converter de volta, você pode usar UNIX_TIMESTAMP: SELECT UNIX_TIMESTAMP(t_time) FROM table_name.

Claro, se você não gosta função do MySQL, você pode sempre usar o PHP: 'INSERT INTO table_name SET t_time = ' . date('Y-m-d H:i:s', $unix_timestamp).

Znarkus
fonte
O timestamp tipo de campo também pode ser lido por humanos (ao usar SELECTno console). Eles são muito diferentes e ambos têm suas desvantagens / vantagens. A principal diferença é como os fusos horários estão sendo tratados.
Udo G
@Udo G: Você está certo, mas ainda prefiro datetimepor vários motivos. Qual é a maior desvantagem / vantagem na sua opinião?
Znarkus
maior vantagem para timestamp: ele corresponde melhor aos carimbos de data / hora do PHP, pois é imune às configurações de fuso horário do servidor e do cliente, enquanto datetimealtera o valor exibido dependendo do fuso horário do seu cliente MySQL (claro que depende do seu projeto, que um é melhor). maior desvantagem para timestamp: não suporta valores NULL e (não sei o que eles fizeram quando programaram) um TIMESTAMP NOT NULLcampo se torna um TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP. No meu caso, infelizmente, preciso usar TIMESTAMPpor motivos de TZ.
Udo G
0

Melhor é usar o tipo de dados varchar(15).

gautamlakum
fonte
3
Salvar um número na forma de corda geralmente não é uma boa prática, pois as cordas são mais lentas em comparação e mais difíceis de realizar cálculos.
RollingBoy
Meu voto vai para o não assinado - mas vamos descer a toca do coelho. Por que varchar e não char? É uma entrada de comprimento fixo - micro-otimização, mas ainda ...
BradChesney79
0

Você pode fazer: $date = \gmdate(\DATE_ISO8601);.

HelpNeeder
fonte
-1

Se eu souber que o banco de dados é MySQL, usarei a função NOW () assim:

INSERT INTO table_name
   (id, name, created_at) 
VALUES 
   (1, 'Gordon', NOW()) 
Jannie Theunissen
fonte
Isso armazenaria apenas o carimbo de data / hora atual, não estritamente o que o OP está pedindo.
charliefortune