unix_timestamp(MySQL)的数据类型是什么?

60

在MySQL中,保存unix_timestamp值时应该使用哪种数据类型?


4
http://dev.mysql.com/doc/refman/5.0/en/datetime.html - teemitzitrone
时间戳和unix_timestamp是相同的吗? - jjz
@user239431:UNIX_TIMESTAMP是MySQL的一个函数:http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html#function_unix-timestamp - OMG Ponies
@user239431 不是这样的。unix_timestamp返回自1970年01月01日00:00:00以来的秒数,而(mysql) timestamp则返回YYYYMMDDHHMMSS或YYMMDDHHMMSS格式的数字。如果您真的需要应用程序中的时间戳(unix),您可以使用NOW()保存当前日期时间,并使用UNIX_TIMESTAMP()返回一个unix_timestap,仍然具有MySQL日期函数的全部功能,请参见http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html。 - teemitzitrone
也值得阅读 http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html#function_from-unixtime - teemitzitrone
4个回答

74

类型为整数,如:

int(11) 

适用于索引和类似 > < = 的条件。


27
如果您使用INT,您需要记住有符号版本只能从-2147483648到2147483647,上限会触发2038年问题。您可以使用INT(11) UNSIGNED或BIGINT - 后者有一些注意事项,但它的数字范围非常广。就我个人而言,我更喜欢使用MySQL的内置函数,但是对于大型数据集的索引和比较函数可能会影响您的选择。 - William Turrell
为了后人的参考,我支持William Turrell的评论。从我的角度来看,UNSIGNED INT是一个很好的选择,但真正的答案将取决于您将数据库信息导入的编程语言(如果从零开始编码)。例如:如果你是Java开发者,UNSIGNED INT映射到java.lang.Long(请参见此处的MySQL + Java用户表5.2:https://dev.mysql.com/doc/connector-j/en/connector-j-reference-type-conversions.html)。这样,你可以在数据库中节省一些空间,同时确保你不会写出将在2038年出现错误的代码。@WilliamTurrell说得好。 - Zack Jannsen
1
就2038年问题而言,将int(11)中的11增加到12或13是否是避免该情况的合理措施? - Brad Hein
无符号标志可以使存储的时间加倍。2038年至1970年为68年,2106年至1970年为136年。 - Gary

19

您想使用TIMESTAMP数据类型。它以时代值的形式存储,但MySQL将该值显示为“YYYY-MM-DD HH:MM:SS”。


4
这句话是在询问哪种MySQL数据类型最适合存储时期值(epoch values)。TIMESTAMP不是答案,因为TIMESTAMP只接受月/日/年的字符串值。参考来源:https://dev.mysql.com/doc/refman/8.0/en/date-and-time-literals.html - WindedHero

5
MySQL DateTime 数据类型以 'YYYY-MM-DD HH:MM:SS' 的格式存储日期,范围从 '1000-01-01 00:00:00' 到 '9999-12-31 23:59:59'。 MySQL TIMESTAMP 数据类型以 'YYYY-MM-DD HH:MM:SS' 的格式存储日期,范围从 UTC 的 '1970-01-01 00:00:01' 到 UTC 的 '2038-01-19 03:14:07'。

Unix TIMESTAMP 是自 1970-01-01 以来的秒数。如果您想将 Unix 时间戳存储在 mysql 数据库中,则应使用带有属性 UNSIGNED(仅允许正数)的 int(11),如果要保存微秒数,则应使用 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

在这种情况下,服务器应该按照原样返回unix时间戳: SELECT yourtable.start_time as date_time


0

BIGINT UNSIGNED NOT NULL

以秒为单位的时代表示可以适合于INT(11) 如果时间戳有毫秒,则可以使用INT(20)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接