Збереження мітки часу в таблиці mysql за допомогою php


94

У мене є поле в таблиці MySQL, яке має timestampтип даних. Я зберігаю дані в цій таблиці. Але коли я передаю позначку часу ( 1299762201428) до запису, вона автоматично зберігає значення 0000-00-00 00:00:00в цій таблиці.

Як я можу зберегти мітку часу в таблиці MySQL?

Ось моя INSERTзаява:

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
Про яку позначку часу ви говорите? Де ти це взяв?
Ваш здоровий глузд

1
Ви можете вставити сюди структуру таблиці ур?

Відповіді:


160

пройти так

date('Y-m-d H:i:s','1299762201428')

7
але значення, яке ви отримуєте в db, показує тип стовпця datetime, якщо ви хочете змінити його на, timestampа потім змініть тип стовпця наvarchar(15)
jimy

2
Потім поставте його на поле INT. У будь-якому випадку, мітка часу є лише поданням дати, і навпаки. Ви можете перетворити з мітки часу на дату за допомогою функції, яку сказав вам Jimy, і в іншому випадку за допомогою strtotime. редагувати: до речі, відмітка часу охоплює лише діапазон усіх можливих дат (я думаю, що з
01 січня 1970 року

4
так для чого використовується тип даних мітки часу? Поле s_time має тип даних мітки часу. Чи не можу я зберегти 1299762201428 у цьому полі?
gautamlakum

@ lakum4stackof: Для типу даних мітки часу зверніться до dev.mysql.com/doc/refman/5.0/en/timestamp.html для деталей.
RollingBoy

1
@ lakum4stackof - використання позначки часу полягає в тому, що ви зберігаєте позначку часу, але вона відображається лише як дата. Внутрішньо (як і всі типи даних) він зберігається як ціле підписане число. Якщо ви також хочете відформатувати цю мітку часу як ціле число, я пропоную вам просто використовувати поле INT тоді. Використання стовпця мітки часу - це маніпуляція датою (додавання інтервалів тощо).
Michael JV

51

Привіт, використовуйте FROM_UNIXTIME()для цього функцію.

Подобається це:

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

Чому це краще ніж date('Y-m-d H:i:s','1299762201428')?
Юрій

5
Тип безпеки: видає власний FROM_UNIXTIMEтип дати mysql, тоді як php date()повертає рядок.
Річард Туїн,

5
Це краще, оскільки веб-сервер (PHP) і MySQL можуть знаходитися в різних місцях. Отже, дата ('Ymd H: i: s', '1299762201428') встановить часовий пояс веб-сервера. З різними веб-серверами, розміщеними в різних зонах, ви будете мати невідповідні дані. Крім того, у своєму коді ви повинні примусити часовий пояс програми до часового поясу MySQL. date_timezone_set
Остіко,


15

Деякі речі для уточнення:

  • Тип поля мітки часу MySQL не зберігає мітки часу unix, а швидше значення типу-часу-дати.
  • Мітка часу UNIX - це число звичайного типу int.
  • Мітка часу, про яку ви говорите, не є звичайною міткою часу unix, а міткою часу з мілісекундами.

тому правильна відповідь буде

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


2

Я здогадуюсь, що поле, в якому ви намагаєтеся зберегти значення, є полем дати та часу, але це не так, але те ж саме, схоже, справедливо для позначок часу . Якщо так, mysql очікує, що формат буде Рік-місяць-день Година: хвилина: секунда. Для того, щоб зберегти позначку часу, вам доведеться перетворити поле в числове, використовуючи такий запит

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

Якщо ви використовуєте поточний час, можете використовувати зараз () або current_timestamp.


2

Можна використовувати now() у своєму запиті, тобто:

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

Він використовуватиме поточну позначку часу.


1

Використовуйте FROM_UNIXTIME() .

Примітка: 1299762201428 виглядає більше як мітка в мілісекундах (наприклад, Date () * 1 у JavaScript), і вам, мабуть, доведеться розділити це на 1000.


1

Перевірте тип поля в таблиці, просто збережіть значення позначки часу в типі даних, наприклад bigintтощо.

Не datetimeтип



0

Якщо мітка часу - поточний час, ви можете скористатися NOW()функцією mysql


0

Використовуйте datetimeтип поля. Він має багато переваг, таких як читабельність людини (ніхто не читає мітки часу) та функції MySQL .

Для перетворення з мітки часу Unix ви можете використовувати функцію MySQL FROM_UNIXTIME(1299762201428). Для того, щоб перетворити назад ви можете використовувати UNIX_TIMESTAMP: SELECT UNIX_TIMESTAMP(t_time) FROM table_name.

Звичайно, якщо вам не подобається , функція MySQL, ви завжди можете використовувати PHP: 'INSERT INTO table_name SET t_time = ' . date('Y-m-d H:i:s', $unix_timestamp).


The timestamp поля теж читається людиною (при використанні SELECTв консолі). Вони дуже різні, і обидва мають свої переваги / переваги. Головна відмінність полягає в тому, як обробляються часові пояси.
Udo G

@Udo G: Ви праві, але я все одно віддаю перевагу datetime з різних причин. Яка найбільша дис / перевага на ваш погляд?
Знаркус,

найбільша перевага для timestamp: він краще відповідає міткам часу PHP, оскільки не захищений від налаштувань часового поясу як сервера, так і клієнта, тоді як datetimeзмінює відображуване значення залежно від часового поясу вашого клієнта MySQL (звичайно, це залежить від вашого проекту, який один краще). найбільший недолік дляtimestamp : він не підтримує значення NULL і (я не знаю, що вони курили, коли це запрограмували) TIMESTAMP NOT NULLполе стає TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP. У моєму випадку мені, на жаль, потрібно використовувати TIMESTAMPз причин ТЗ.
Udo G

0

Краще використовувати тип даних varchar(15).


3
Збереження числа у вигляді рядка, як правило, не є гарною практикою, оскільки рядки повільніші в порівнянні та важче виконати обчислення.
RollingBoy

Я голосую за непідписаний int-- але давайте спустимося по кроличій норі. Чому varchar, а не char? Це запис фіксованої довжини - мікрооптимізація, але все ж ...
BradChesney79


-1

Якщо я знаю, що база даних MySQL, я буду використовувати функцію NOW () наступним чином:

INSERT INTO table_name
   (id, name, created_at) 
VALUES 
   (1, 'Gordon', NOW()) 

Це буде зберігати лише поточну позначку часу, а не строго те, про що вимагає OP.
charliefortune
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.