【问题标题】:MySQL convert every date field to timestampMySQL将每个日期字段转换为时间戳
【发布时间】:2014-05-08 12:15:09
【问题描述】:

我用 sencha touch 2 和 mysql 开发了一个混合应用程序。 问题是我犯了一个大错误。我以这种格式将所有日期字段保存为 varchar:

'23.05.2013 19:00'

现在对这个字段进行排序非常复杂。我现在想将每个字段都转换为时间戳。

我可以用 mysql 查询来做到这一点吗?

还是我必须用 PHP 读取每条记录,更改值并更新字段?

【问题讨论】:

  • datetime 数据时间使用内部存储。不要将此与datetime 的介绍相混淆。您可以使用order by datetimecol 进行排序。你绝对没有犯错。
  • 在我看来你犯了一个大错误!这不是日期时间格式。
  • 没有一种方法可以帮助您更改列的存储类型并正确导入数据。您可以做的是创建另一个包含datetime 的列(临时),并运行一个查询来读取每个 varchar 列,对其进行格式化并填充临时日期时间列。之后,只需将坏列从 varchar 更改为 datetime 并使用 temp 列中的值填充它,之后您可以删除这些值。只需 3 次查询,您就可以从终端完成。
  • 你是对的......秒数不见了。这也许也是我无法对该字段进行排序的问题。

标签: php mysql timestamp unix-timestamp


【解决方案1】:

假设我们要将 '23.05.2013 19:01' 转换为 '2013-05-23 19:01:00',我们可以使用 SUBSTRING_INDEX()MAKEDATE()

SET @dt := '23.05.2013 19:01';

SELECT @dt, SUBSTRING_INDEX(@dt, '.', 1) AS day,
  SUBSTRING_INDEX(SUBSTRING_INDEX(@dt, '.', 2), '.', -1) AS month,
  SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(@dt, '.', 3), '.', -1), ' ', 1) AS year,
  SUBSTRING_INDEX(SUBSTRING_INDEX(@dt, ' ', -1), ':', 1) AS hour,
  SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(@dt, ' ', -1), ':', 2), ':', -1) AS minute,
  '00' AS second;
+------------------+------+-------+------+------+--------+--------+
| @dt              | day  | month | year | hour | minute | second |
+------------------+------+-------+------+------+--------+--------+
| 23.05.2013 19:01 | 23   | 05    | 2013 | 19   | 01     | 00     |
+------------------+------+-------+------+------+--------+--------+
1 row in set (0.00 sec)

SELECT @dt, CONCAT(SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(@dt, '.', 3), '.', -1), ' ', 1), '-',
  SUBSTRING_INDEX(SUBSTRING_INDEX(@dt, '.', 2), '.', -1), '-',
  SUBSTRING_INDEX(@dt, '.', 1), ' ',
  SUBSTRING_INDEX(SUBSTRING_INDEX(@dt, ' ', -1), ':', 1), ':',
  SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(@dt, ' ', -1), ':', 2), ':', -1), ':00') AS datetime;
+------------------+---------------------+
| @dt              | datetime            |
+------------------+---------------------+
| 23.05.2013 19:01 | 2013-05-23 19:01:00 |
+------------------+---------------------+
1 row in set (0.00 sec)

最后,我们需要以下 SQL;

// add temp column
ALTER TABLE tab ADD valid_datetime DATETIME;

// update temp column to valid datetime value
UPDATE tab SET valid_datetime = CONCAT(SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(wrong_datetime, '.', 3), '.', -1), ' ', 1), '-',
  SUBSTRING_INDEX(SUBSTRING_INDEX(wrong_datetime, '.', 2), '.', -1), '-',
  SUBSTRING_INDEX(wrong_datetime, '.', 1), ' ',
  SUBSTRING_INDEX(SUBSTRING_INDEX(wrong_datetime, ' ', -1), ':', 1), ':',
  SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(wrong_datetime, ' ', -1), ':', 2), ':', -1), ':00');

// rename temp column to old column
ALTER TABLE tab DROP wrong_datetime, CHANGE valid_datetime wrong_datetime DATETIME;

【讨论】:

    【解决方案2】:

    谢谢大家的指点!

    我现在管理它对表格进行排序而不将其转换为时间戳:

    SELECT datefield FROM mytable ORDER BY STR_TO_DATE(datefield, '%d.%m.%Y %H:%i') DESC
    

    现在我可以对表格进行排序或将其转换为时间戳,如 N.B.建议。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-23
      • 2023-03-24
      • 1970-01-01
      • 2013-09-27
      • 2019-07-21
      • 2012-06-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多