【问题标题】:What is the data type for unix_timestamp (MySQL)?unix_timestamp (MySQL) 的数据类型是什么?
【发布时间】:2011-05-06 18:32:18
【问题描述】:

我应该使用什么数据类型来保存 unix_timestamp 值 (MySQL)?

【问题讨论】:

标签: sql mysql types


【解决方案1】:

类型是整数,如:

int(11) 

适用于索引和条件,如> < =

【讨论】:

  • 如果您使用 INT,您需要记住签名版​​本仅从 -2147483648 到 2147483647,上限触发year 2038 bug。您可以使用 INT(11) UNSIGNED 或 BIGINT - 后者有 some caveats,但它是 massive。我个人觉得 MySQL 的内置函数更安全,但大型数据集的索引和比较函数可能会影响你。
  • 为了后代我 +1 William Turrell 的评论。从我的角度来看,UNSIGNED INT 将是可行的方法,但最真实的答案将取决于您将数据库信息提取到的语言(如果从头开始编码)。示例:如果您是 Java 商店,UNSIGNED INT 映射到 java.lang.Long(请参阅此处的表 5.2,MySQL + Java 用户:dev.mysql.com/doc/connector-j/en/…)。这样,您可以在数据库中节省一些空间,同时确保您不会编写会在 2038 年遇到错误的代码。好点@WilliamTurrell。
  • 就 2038 漏洞而言,将int(11) 中的 11 增加到 12 或 13 不是避免这种情况的合理措施吗?
  • @BradHein 11 是或显示,而不是可以存储的大小。 UNSIGNED int 的最大值始终为 4294967295。请参阅dev.mysql.com/doc/refman/5.7/en/integer-types.html。将该数字输入一个纪元转换器,然后查看该字段可以保存大约 2106 年 2 月 7 日的日期。epochconverter.com/…
  • 可以存储的时间是 unsigned 标志的两倍。 2038-1970=68 年,2106-1970=136 年。
【解决方案2】:

您想使用TIMESTAMP data type
它存储为一个纪元值,但 MySQL 将该值显示为 'YYYY-MM-DD HH:MM:SS'。

【讨论】:

【解决方案3】:

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' 格式存储日期,范围从 '1970-01-01 00:00:01' UTC 到 '2038 -01-19 03:14:07' UTC。

Unix TIMESTAMP 是自 1970-01-01 以来的秒数,如果您想将 unix Timestamp 存储在 mysql db 中,您应该使用带有属性 UNSIGNEDint(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

(在这种情况下,服务器应按原样返回 unixTimestamp: SELECT yourtable.start_time as date_time)

【讨论】:

    【解决方案4】:

    BIGINT UNSIGNED NOT NULL

    以秒为单位的纪元表示可以适应INT(11) 如果时间戳有毫秒,可以使用INT(20)

    【讨论】:

      猜你喜欢
      • 2017-01-09
      • 2019-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-17
      相关资源
      最近更新 更多