Сохранение метки времени в таблице 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
О какой метке времени вы говорите? Откуда это у вас?
Your Common Sense

1
Вы можете вставить здесь структуру таблицы ur?

Ответы:


160

пройти вот так

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

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

2
Затем поместите его в поле INT. В любом случае, временная метка - это только представление даты, и наоборот. Вы можете преобразовать метку времени в дату с помощью функции, которую вам сказал Джимми, и наоборот, используя strtotime. изменить: кстати, временная метка охватывает только диапазон всех возможных дат (от 1970-01-01 до xx-xx-2032, я думаю)
Карлос Кампдеррос,

4
так в чем же польза от типа данных timestamp? Поле s_time имеет тип данных timestamp. Разве я не могу сохранить 1299762201428 в это поле?
gautamlakum

@ lakum4stackof: подробности о типе данных timestamp см. на странице dev.mysql.com/doc/refman/5.0/en/timestamp.html .
RollingBoy

1
@ lakum4stackof - отметка времени используется в том, что вы сохраняете отметку времени, но она отображается только как дата. Внутри (как и все типы данных) он хранится как целое число со знаком. Если вы также хотите отформатировать эту метку времени как целое число, я предлагаю вам просто использовать поле INT. Использование столбца timestamp - это манипуляция датой (добавление интервалов и т. Д.).
Michael JV,

52

Привет, используйте 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 могут находиться в разных местах. Итак, date ('Ymd H: i: s', '1299762201428') установит часовой пояс веб-сервера. При размещении разных веб-серверов в разных зонах у вас будут противоречивые данные. В качестве альтернативы в вашем коде вы должны принудительно установить часовой пояс приложения в часовой пояс MySQL. date_timezone_set
Ostico


15

Некоторые вещи, которые нужно уточнить:

  • Тип поля MySQL timestamp не хранит временные метки unix, а скорее значение типа datetime.
  • Метка времени UNIX - это число обычного типа int.
  • Отметка времени, о которой вы говорите, - это не обычная отметка времени unix, а отметка времени с миллисекундами.

поэтому правильный ответ будет

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

3

Тип данных bigint unsigned может соответствовать этому требованию.


2

Я предполагаю, что поле, в котором вы пытаетесь сохранить значение, является полем даты и времени, это не так, но то же самое, похоже, верно и для временных меток . В таком случае mysql ожидает, что формат будет иметь вид Год-месяц-день Час: минута: секунда. Чтобы сохранить метку времени, вам нужно будет преобразовать поле в числовое, используя запрос типа

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

Если вы используете текущее время, вы можете использовать now () или 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).


Тип timestamp поля также доступен для чтения человеком (при использовании SELECTв консоли). Они очень разные, и у обоих есть свои недостатки / преимущества. Основное различие заключается в том, как обрабатываются часовые пояса.
Udo G

@Udo G: Вы правы, но я все же предпочитаю datetimeпо разным причинам. Что, по вашему мнению, является самым большим недостатком / преимуществом?
Znarkus

Самое большое преимущество timestamp: он лучше соответствует временным меткам PHP, поскольку он невосприимчив к настройкам часового пояса как сервера, так и клиента, тогда как datetimeизменяет отображаемое значение в зависимости от часового пояса вашего клиента MySQL (конечно, это зависит от вашего проекта, который один лучше). Самый большой недостаток timestamp: он не поддерживает значения NULL и (я не знаю, что они курили, когда программировали это) TIMESTAMP NOT NULLполе становится TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP. В моем случае мне, к сожалению, нужно использовать TIMESTAMPпо причинам TZ.
Udo G

0

Лучше использовать тип данных varchar(15).


3
Сохранение числа в виде строки обычно не является хорошей практикой, поскольку строки медленнее по сравнению и сложнее выполнять вычисления.
RollingBoy

Я голосую за unsigned 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.