【问题标题】:Saving timestamp in mysql table using php使用php在mysql表中保存时间戳
【发布时间】:2011-08-03 17:03:04
【问题描述】:

我在 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')

【问题讨论】:

  • 什么时间戳你在说什么?你从哪里弄来的?
  • 你可以在这里粘贴你的表结构吗?

标签: php mysql database sql-insert


【解决方案1】:

这样通过

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

【讨论】:

  • 但是你在db中得到的值显示列类型是datetime,如果你想把它改成timestamp然后把列类型改成varchar(15)
  • 然后把它放在一个 INT 字段上。无论如何,时间戳只是日期的表示,反之亦然。您可以使用 jimy 告诉您的函数将时间戳转换为日期,而使用 strtotime 则相反。编辑:顺便说一句,时间戳仅涵盖所有可能日期的范围(我认为是 1970-01-01 到 xx-xx-2032)
  • 那么时间戳数据类型有什么用呢? s_time 字段具有时间戳数据类型。我不能将 1299762201428 保存到该字段吗?
  • @lakum4stackof:时间戳数据类型请参考dev.mysql.com/doc/refman/5.0/en/timestamp.html了解详情。
  • @lakum4stackof - 使用时间戳是您确实保存了时间戳,但它仅显示为日期。在内部(与所有数据类型一样)它存储为有符号整数。如果您还想将该时间戳格式化为整数,我建议您只使用 INT 字段。时间戳列的使用是日期操作(添加间隔等)。
【解决方案2】:

如果时间戳是当前时间,可以使用mysql的NOW()函数

【讨论】:

    【解决方案3】:

    数据类型“bigint unsigned”可能适合此要求。

    【讨论】:

      【解决方案4】:

      我猜测您尝试保存值的字段是日期时间字段它不是,但时间戳似乎也是如此。如果是这样,mysql 期望格式为年-月-日时:分:秒。为了保存时间戳,您必须使用类似的查询将字段转换为数字

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

      如果您使用的是当前时间,您可以使用 now() 或 current_timestamp。

      【讨论】:

        【解决方案5】:

        您好,请使用 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')好?
        • 类型安全:FROM_UNIXTIME 产生一个原生 mysql 日期类型,而 php 的 date() 返回一个字符串。
        • 这样更好,因为 Web 服务器 ( PHP ) 和 MySQL 可以在不同的地方。因此, date('Y-m-d H:i:s','1299762201428') 将设置 Web 服务器的时区。将不同的 Web 服务器放置在不同的区域中,您将获得不一致的数据。或者,在您的代码中,您必须将应用程序时区强制为 MySQL 的时区。 date_timezone_set
        【解决方案6】:

        使用FROM_UNIXTIME()

        注意:1299762201428 看起来更像是一个毫秒时间戳(如 JavaScript 中的 Date()*1),您可能需要将其除以 1000。

        【讨论】:

          【解决方案7】:

          使用datetime 字段类型。它具有许多优点,例如人类可读性(没有人读取时间戳)和MySQL functions

          要从 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:你说得对,但出于各种原因,我还是更喜欢datetime。您认为最大的缺点/优点是什么?
          • timestamp 的最大优势:它更好地匹配 PHP 时间戳,因为它不受服务器和客户端的时区设置的影响,而 datetime 改变了它显示 值取决于你的 MySQL 客户端的时区(当然这取决于你的项目,哪个更好)。 timestamp 的最大缺点:它不支持 NULL 值并且(我不知道他们在编程时做了什么)TIMESTAMP NOT NULL 字段变成了TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP。就我而言,不幸的是,出于 TZ 的原因,我需要使用TIMESTAMP
          【解决方案8】:

          最好使用数据类型varchar(15)

          【讨论】:

          • 以字符串的形式保存数字通常不是一个好习惯,因为字符串比较慢并且更难计算。
          • 我的票投给了 unsigned int-- 但让我们从兔子洞里走下去。为什么是 varchar 而不是 char?它是一个固定长度的条目——微优化,但仍然......
          【解决方案9】:

          检查表中的字段类型,只需将时间戳值保存在 bigint 等数据类型中。

          不是datetime 类型

          【讨论】:

            【解决方案10】:

            需要澄清的一些事情:

            • MySQL 时间戳字段类型不存储 unix 时间戳,而是存储日期时间类型的值。
            • UNIX 时间戳是一个常规 int 类型的数字。
            • 您所说的时间戳不是普通的unix时间戳,而是以毫秒为单位的时间戳。

            所以正确答案是

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

            【讨论】:

              【解决方案11】:

              应该这样做:

                $time = new DateTime; 
              

              【讨论】:

                【解决方案12】:

                您也可以在查询中使用now(),即:

                insert into table (time) values(now());
                

                它将使用当前时间戳。

                【讨论】:

                  【解决方案13】:
                  $created_date = date("Y-m-d H:i:s");
                  $sql = "INSERT INTO $tbl_name(created_date)VALUES('$created_date')";
                  $result = mysql_query($sql);
                  

                  【讨论】:

                    【解决方案14】:

                    如果我知道数据库是 MySQL,我会像这样使用 NOW() 函数:

                    INSERT INTO table_name
                       (id, name, created_at) 
                    VALUES 
                       (1, 'Gordon', NOW()) 
                    

                    【讨论】:

                    • 这将仅存储当前时间戳,而不是严格意义上的 OP 要求的。
                    【解决方案15】:

                    你可以这样做:$date = \gmdate(\DATE_ISO8601);

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 1970-01-01
                      • 2013-02-18
                      • 1970-01-01
                      • 2013-12-28
                      • 1970-01-01
                      • 2011-09-25
                      • 1970-01-01
                      • 1970-01-01
                      相关资源
                      最近更新 更多