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

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

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

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

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

3

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


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.


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.


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.


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



0

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


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


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


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


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

Isso armazenaria apenas o carimbo de data / hora atual, não estritamente o que o OP está pedindo.
charliefortune
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.