【问题标题】:How to convert datetime attribute into unix timestamp attribute?如何将 datetime 属性转换为 unix 时间戳属性?
【发布时间】:2013-11-24 01:06:19
【问题描述】:

我想通过更改“date_added”列的数据类型来升级我的数据库表

`date_added` datetime DEFAULT NULL

`new_date_added` bigint(20) NOT NULL

date_added 具有以“YYYY-MM-DD HH:MM:SS”格式存储的日期时间值。这个数据库表有超过 15000 行。执行此修改的最佳方法是什么?

注意:我已尝试执行以下 MySql 查询:

ALTER TABLE  `my_table` ADD  `new_date_added` bigint(20) NOT NULL AFTER  `date_added`;
UPDATE `my_table` SET new_date_added = UNIX_TIMESTAMP(  `date_added` );
ALTER TABLE  `my_table` DROP `date_added`;

上述解决方案不会将日期时间值转换为正确的 unix_timestamp。如果我将修改后创建的 UNIX 时间戳与其原始日期时间值进行比较,则存在 19800 秒的差异。

【问题讨论】:

  • datetime 字段已在 mysql 内部存储为 unix 时间戳
  • 19800 秒 = 5:30 小时。我敢打赌:你在印度(格林威治标准时间 + 5:30)
  • 我应该在我的 sql 查询中进行哪些更改才能创建正确的时间戳值?
  • 我在回答中添加了编辑

标签: php mysql sql


【解决方案1】:

我找到了解决问题的方法。 以下是给我正确时间戳的最终工作代码:

SET time_zone = "+00:00";
ALTER TABLE  `my_table` ADD  `new_date_added` bigint(20) NOT NULL AFTER  `date_added`;
UPDATE `my_table` SET new_date_added = UNIX_TIMESTAMP(  `date_added` );
ALTER TABLE  `my_table` DROP `date_added`;

@Ela Buwa:我编写了完全相同的代码,这给了我一个不正确的时间戳值(由于自动调整/移位的时间戳值)

@Pekka:我的问题是关于 mysql 的 UNIX_TIMESTAMP() 给了我意想不到的值。使用 PHP 的 date() 函数不会影响 mysql 的时区设置。这就是为什么我使用SET time_zone = "+00:00"; 来配置mysql 的时区。不过,感谢您抽出时间回答我的问题。

感谢大家的努力和宝贵的时间。

【讨论】:

  • 这只有 kind of 可以解决您的问题。你仍然有 GMT 时间戳——你只是欺骗了 mySQL 相信你正在导入的数据也是 GMT。我想如果你真的知道自己在做什么,它是可行的,但这不是一个理想的解决方案(你也真的确定你首先需要这样做吗?DATETIME 有什么问题?)
【解决方案2】:

我会使用 strtotime。 它表示自 1970-01-01 00:00:00 以来经过的秒数时间

<?php
echo(strtotime("now") . "<br>");
echo(strtotime("3 October 2005") . "<br>");
echo(strtotime("+5 hours") . "<br>");
echo(strtotime("+1 week") . "<br>");
echo(strtotime("+1 week 3 days 7 hours 5 seconds") . "<br>");
echo(strtotime("next Monday") . "<br>");
echo(strtotime("last Sunday"));
?>

如果你想在 mysql 中使用,请使用 UPDATE table_name SET timefield=UNIX_TIMESTAMP(timefield); 不过我还没有测试过。 您可能想在此处查看 mysql 文档。 http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html

【讨论】:

    【解决方案3】:

    19800 秒 = 5:30 小时。您可能位于印度 (GMT + 5:30)。

    UNIX_TIMESTAMP() 生成的时间戳为relative to GMT,因此您的值很可能是正确的。

    要恢复正确的值,您可以例如使用 PHP 的 date()set the correct timezone.

    不过,请确保您首先有充分的理由离开 DATETIME。它通常是高级格式,允许在 mySQL 中进行各种优化操作,并且不受 32 位时间戳所具有的year 2038 problem 的影响。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-30
      • 1970-01-01
      • 1970-01-01
      • 2014-10-26
      • 2021-04-03
      • 2020-10-09
      • 1970-01-01
      • 2021-08-31
      相关资源
      最近更新 更多