【问题标题】:MYSQL: How to convert VARCHAR column containing dates to a DATE column?MYSQL:如何将包含日期的 VARCHAR 列转换为 DATE 列?
【发布时间】:2010-11-19 10:09:14
【问题描述】:

我有一个大的生日表,我想将其从 varchar 列转换为日期列。

表SQL为:

CREATE TABLE `birthdays` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `uid` bigint(20) DEFAULT NULL,
  `birthday_date` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM

生日日期以两种方式之一存储:字符串,如“05/26/1994”或有时“03/14”(适用于不想透露出生年份的人)。

创建另一个表并将生日存储在日期列中的最佳方法是什么?是否可以仅使用 MySQL(并避免使用 PHP 或其他中介)来做到这一点? p>

我在 MySQL 中找到了一个 STR_TO_DATE 函数。我应该使用这个吗?

谢谢!

【问题讨论】:

  • 你不能 - 日期由 YYY-MM-DD 组成,缺少年份信息将是 STR_TO_DATE 的问题

标签: mysql date varchar


【解决方案1】:
SELECT IF(birthday_date RLIKE '[0-9]{2}/[0-9]{2}/[0-9]{4}',STR_TO_DATE(birthday_date,'%m/%d/%Y'),STR_TO_DATE(birthday_date,'%m/%d'));

对于未输入年份的行,这将产生类似 0000-03-14 的日期。您的服务器需要配置为允许无效日期(请参阅http://dev.mysql.com/doc/refman/5.0/en/server-sql-mode.html

【讨论】:

  • 谢谢!这非常有用。一般来说,以 0000 年存储的日期是否会导致问题?我从来没有存储过没有特定年份的日期或日期时间。
  • 有几个问题。最明显的是对这些日期进行排序(它们将在开始时分组)。还有可移植性问题 - 如果您需要将此数据迁移到其他服务器,则需要确保它允许无效日期。迁移到其他 RDBMS 也很棘手。
  • DATETIME 支持的最短日期为 1000-01-01,因此您可能希望改用 1000 年。
【解决方案2】:

如果您将列转换为 DateTime,那么您将无法存储缺少年份的日期,例如“03/14”。因此,我建议保持原样,如果您真的需要,可能还有另一列用于存储 dateTime。 还有内部触发器将日期字符串从 varchar 列转换为 dateTime 列。

是的,你必须使用 STR_TO_DATE 方法来达到你的目的。

【讨论】:

  • 感谢您的回答。一般问题:如果表有数百万行,最好将生日存储为 varchar 还是尝试将它们存储为日期(并且可能将没有年份的生日存储为 03/14/0000 之类的东西)?
  • @Eric - 通常将日期存储为 dateTime 字段本身总是更好,这可能是因为您将有一个标准的保存格式,并且应该易于与其他日期进行比较。例如:- 所有在这一年出生的用户。等等。年份'0000',我不知道它是否有效,但是是的,你可以给出一些模糊的值,比如 1500 之类的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-09
  • 2011-06-10
  • 1970-01-01
  • 1970-01-01
  • 2020-10-24
  • 1970-01-01
相关资源
最近更新 更多