Каков тип данных для unix_timestamp (MySQL)?

Какой тип данных следует использовать для сохранения значения unix_timestamp (MySQL)?


person jzarsuelo    schedule 08.11.2010    source источник
comment
dev.mysql.com/doc/refman/5.0/en/datetime. html   -  person teemitzitrone    schedule 08.11.2010
comment
Является ли временная метка такой же, как unix_timestamp?   -  person jzarsuelo    schedule 08.11.2010
comment
@user239431: UNIX_TIMESTAMP — это функция MySQL: dev.mysql.com/doc/refman/5.1/en/   -  person OMG Ponies    schedule 08.11.2010
comment
@user239431 user239431 нет. unix_timestamp возвращает секунды с '1970-01-01 00:00:00' и (mysql) временную метку числа в формате ГГГГММДДЧЧММСС или ГГММДДЧЧММСС. если вам действительно нужна метка времени (unix) в вашем приложении, вы можете сохранить текущую дату и время с помощью NOW() и вернуть unix_timestap с помощью UNIX_TIMESTAMP() и при этом иметь всю мощь функций даты MySQL, см. dev.mysql.com/doc/refman/5.1/en/date-and-time- functions.html   -  person teemitzitrone    schedule 08.11.2010
comment
также стоит прочитать dev. mysql.com/doc/refman/5.1/ru/   -  person teemitzitrone    schedule 08.11.2010


Ответы (4)


тип целочисленный, например:

int(11) 

подходит для индексации и таких условий, как > < =

person Haim Evgi    schedule 08.11.2010
comment
Если вы используете INT, вам нужно помнить, что подписанная версия идет только от -2147483648 до 2147483647, верхняя граница вызывает ошибка 2038 года. Вы можете использовать INT(11) UNSIGNED или BIGINT — есть несколько предостережений относительно последнего, но он массовый. Лично я чувствую себя в большей безопасности со встроенными функциями MySQL, но функции индексирования и сравнения для больших наборов данных могут повлиять на вас. - person William Turrell; 25.03.2013
comment
Для потомков я +1 комментарий Уильяма Таррелла. С моей точки зрения, UNSIGNED INT был бы подходящим способом, но самый верный ответ будет зависеть от языка, на который вы загружаете информацию из базы данных (если кодируете с нуля). Пример: если вы являетесь магазином Java, UNSIGNED INT сопоставляется с java.lang.Long (см. таблицу 5.2 здесь для пользователей MySQL + Java: dev.mysql.com/doc/connector-j/en/). Таким образом, вы сэкономите место в БД, гарантируя, что вы не напишете код, который столкнется с ошибкой в ​​​​2038 году. Отличное замечание @WilliamTurrell. - person Zack Jannsen; 03.02.2016
comment
С точки зрения ошибки 2038 года, разве увеличение 11 в int(11) до 12 или 13 не будет разумной мерой, чтобы избежать ситуации? - person Brad Hein; 29.11.2017
comment
@BradHein 11 – это отображение, а не размер того, что можно сохранить. Максимальное значение UNSIGNED int всегда равно 4294967295. См. dev. mysql.com/doc/refman/5.7/en/integer-types.html. Вставьте это число в преобразователь эпох и посмотрите, что поле может хранить даты примерно до 7 февраля 2106 года. nofollow noreferrer">epochconverter.com/ - person Gary; 02.11.2019
comment
Время, которое может быть сохранено, удваивается с беззнаковым флагом. 2038-1970=68 лет и 2106-1970=136 лет. - person Gary; 02.11.2019

Вы хотите использовать тип данных TIMESTAMP.
Это хранится как значение эпохи, но MySQL отображает значение как «ГГГГ-ММ-ДД ЧЧ:ММ:СС».

person OMG Ponies    schedule 08.11.2010
comment
Я считаю, что вопрос заключается в том, какой тип данных MySQL лучше всего подходит для хранения значений эпохи. TIMESTAMP не будет здесь ответом, поскольку единственными допустимыми значениями для TIMESTAMP являются строки месяца/дня/года. Источник: dev.mysql.com/doc/ refman/8.0/en/date-and-time-literals.html - person WindedHero; 30.06.2020

Тип данных MySql DateTime хранит дату в формате «ГГГГ-ММ-ДД ЧЧ:ММ:СС» в диапазоне от «1000-01-01 00:00:00» до «9999-12-31». 23:59:59'.

Тип данных MySql TIMESTAMP хранит дату в формате «ГГГГ-ММ-ДД ЧЧ:ММ:СС» в диапазоне от «1970-01-01 00:00:01» UTC до «2038-01-». 19 03:14:07' UTC.

Unix TIMESTAMP – это количество секунд, прошедших с 1970-01-01. Если вы хотите сохранить временную метку unix в mysql db, вам следует использовать int(11) с атрибутом UNSIGNED (чтобы разрешить только положительные числа), и если вы хотите сохранить количество микросекунд, которое вы должны использовать bigint(20),..

Если вы хотите получить unixtimestamp в удобочитаемом формате в выбранном запросе, вы можете использовать

SELECT FROM_UNIXTIME(CAST(yourtable.start_time as UNSIGNED)) as date_time

Если вы используете php, вы можете использовать:

$unixtimestamp= time();//1544619186

echo(date("Y-m-d", $unixtimestamp));//2018-12-12

Если вы хотите отображать дату и время с использованием местного часового пояса в Javascript, используйте эту функцию.

  function timeConverter(UNIX_timestamp){
        var date = new Date(UNIX_timestamp*1000);
        var year = date.getFullYear();
        var month = ("0"+(date.getMonth()+1)).substr(-2);
        var day = ("0"+date.getDate()).substr(-2);
        var hour = ("0"+date.getHours()).substr(-2);
        var minutes = ("0"+date.getMinutes()).substr(-2);
        var seconds = ("0"+date.getSeconds()).substr(-2);
    
        return year+"-"+month+"-"+day+" "+hour+":"+minutes+":"+seconds;
    }
   console.log(timeConverter(value));// 2018-14-12 13:11:33

(В этом случае сервер должен вернуть unixTimestamp как есть: SELECT yourtable.start_time as date_time)

person Ahmad Zahabi    schedule 12.12.2018

BIGINT UNSIGNED NOT NULL

Представление эпохи в секундах может поместиться в INT(11). Если метка времени имеет миллисекунды, INT(11) не работает в MySQL.

person Ramesh Krishnan    schedule 12.12.2020