Сохранение метки времени в таблице 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
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

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

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

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

$timestamp = '1299762201428';
$date = date('Y-m-d H:i:s', substr($timestamp, 0, -3));
Ваш здравый смысл
источник
3

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

RollingBoy
источник
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тип


источник
1

Это должно сделать это:

  $time = new DateTime; 
Misaizdaleka
источник
0

Если метка времени - текущее время, вы можете использовать NOW()функцию mysql

ipsum
источник
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,
0

Вы можете сделать: $date = \gmdate(\DATE_ISO8601);.

HelpNeeder
источник
-1

Если я знаю, что это база данных MySQL, я буду использовать функцию NOW () следующим образом:

INSERT INTO table_name
   (id, name, created_at) 
VALUES 
   (1, 'Gordon', NOW()) 
Дженни Теуниссен
источник
Это будет хранить только текущую метку времени, а не строго то, что запрашивает OP.
charliefortune