我想通过将列"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 秒的差异。
19800 秒 = 5:30 小时。您可能位于印度(GMT + 5:30)。
UNIX_TIMESTAMP()
生成相对于 GMT 的时间戳,因此您的值很可能是正确的。
为了获得正确的值,您可以使用PHP的date()
并设置正确的时区。
但是,请确保您有一个很好的理由首先离开DATETIME。它通常是高级格式,允许在mySQL中进行各种优化操作,并且没有32位时间戳具有的2038年问题。
我找到了我的问题的解决方案。以下是最终的工作代码,它给了我正确的时间戳:
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的时区。谢谢你花时间回答我的问题。
感谢大家的努力和宝贵的时间。
我会使用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中做到这一点,请使用更新table_name设置时间字段=UNIX_TIMESTAMP(时间字段);不过我还没有测试过。您可能想在此处查看 mysql 文档。http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html