【问题标题】:mysql STR_TO_DATE not workingmysql STR_TO_DATE 不工作
【发布时间】:2014-10-23 01:06:10
【问题描述】:

我有一个表,其中有一个名为 birthdayvarchar

CREATE TABLE IF NOT EXISTS `test` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `birthday` varchar(30) COLLATE utf16_unicode_ci NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf16 COLLATE=utf16_unicode_ci AUTO_INCREMENT=5 ;

INSERT INTO `test` (`id`, `birthday`) 
VALUES (1, '20041225'),
       (2, '2004-12-25'),
       (3, '19941225'),
       (4, '19941201');

我尝试运行这个查询:

SELECT str_to_date(birthday,"%Y%m%d") 
FROM `test` 
WHERE 1

但它总是返回空值的行。

如果我运行查询:

SELECT str_to_date('20141225',"%Y%m%d") 
FROM `test` 
WHERE 1

它将返回2014-12-25

那么我的查询有什么问题?

【问题讨论】:

    标签: mysql str-to-date


    【解决方案1】:

    您在创建表时遇到了 COLLATE 问题。如果您使用 utf8_unicode_ci 则没有任何问题。请参阅sqlfiddle 上的此示例。有关排序规则的更多信息,您可以阅读此Post

    【讨论】:

    • 为此 +1,但对于与格式不匹配的值(例如,第 2 行中的 YYYY-MM-DD),它仍会返回 null。如果您根本不指定 COLLATE,它也可以正常工作。
    • @scrowler 你是对的if you don't specify a COLLATE 然后它将采用默认的 utf8_unicode_ci 这就是它起作用的原因。
    • 这仍然不是解决这个问题的正确方法,因为输入数据格式的不一致意味着选择了错误的函数。
    【解决方案2】:

    留给simpler functions。 DATE() 以 YYYY-MM-DD 格式返回字符串的日期部分:

    SELECT DATE(birthday) FROM `test`
    

    结果:

    2004-12-25      
    2004-12-25      
    1994-12-25      
    1994-12-01      
    

    您的代码不起作用的原因是 STR_TO_DATE() 需要相同的输入和输出格式,例如STR_TO_DATE('2014-08-29', '%Y-%m-%d')。看看examples in the documentation。此功能主要用于将日期或时间从一种格式转换为另一种格式,其中原始格式来自 MySQL 外部,例如您希望将数据导入 MySQL 的日期格式 - 在这种情况下,您将知道原始格式是什么日期格式是。

    例子:

    SELECT STR_TO_DATE('20041225', '%Y-%m-$d');   -- null - formats don't match
    SELECT STR_TO_DATE('2004-12-25', '%Y-%m-%d'); -- 2004-12-25 - formats match
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-03
      • 1970-01-01
      • 2014-05-30
      • 2013-07-19
      • 1970-01-01
      • 2018-03-28
      • 2020-11-11
      • 2017-03-16
      相关资源
      最近更新 更多