【问题标题】:Mysql - Multiple incorrect date format storedMysql - 存储了多个不正确的日期格式
【发布时间】:2013-07-23 15:44:21
【问题描述】:

我正在处理我之前的开发人员一直很懒惰并且没有以固定格式存储日期的数据。它作为 varchar 而不是日期时间。不用说它让我需要对数据进行排序。

有两种格式

1) {dd}/{mm}/{yyyy} {hh}:{mm}
2) {dd}.{mm}.{yyyy} {hh}:{mm}

我想确保它始终以 mysql 日期格式返回。下面的查询将得到第一个。

SELECT 
  str_to_date( a.rentalstart, '%d/%m/%Y %k:%i' ),
  a.* 
FROM 
  jupiter1.table a
ORDER by createtime DESC

如何将两者结合起来?如果匹配,我还需要它默认为正常的 mysql 日期时间。

{yyyy}-{mm}-{dd} {hh}:{mm}:{ss}

【问题讨论】:

    标签: mysql date date-format


    【解决方案1】:
    SELECT CASE WHEN a.rentalstart LIKE "%/%/% %:%"
                THEN str_to_date( a.rentalstart, '%d/%m/%Y %k:%i' )
                WHEN a.rentalstart LIKE "%.%.% %:%"
                THEN str_to_date( a.rentalstart, '%d.%m.%Y %k:%i' )
                ELSE CAST(a.rentalstart AS DATETIME)
           END AS rentalstart_good,
           a.*
    FROM ...
    

    【讨论】:

    • 感谢您提供的答案。我特别喜欢使用 CAST
    • @Robbo_UK:实际上,CAST() 是确保结果集中的 rentalstart_good 列是时间数据类型所必需的 - 否则它将是一个字符串。
    【解决方案2】:

    你可以简单地做REPLACE。它会将{dd}.{mm}.{yyyy} {hh}:{mm}格式的所有记录转换为DateTime数据类型。

    SELECT  STR_TO_DATE(REPLACE(a.rentalstart, '/', '.'), '%d.%m.%Y %k:%i') newDate,
            a.*
    FROM    jupiter1.table a
    ORDER   BY newDate DESC
    

    【讨论】:

    • "如果匹配{yyyy}-{mm}-{dd} {hh}:{mm}:{ss}",我还需要它默认为正常的mysql日期时间
    【解决方案3】:
    SELECT 
      str_to_date( replace(replace(a.rentalstart, '.', '-'), '/', '-'), if(a.rentalstart like '%-%-%-%', '%Y-%m-%d %k:%i', '%d-%m-%Y %k:%i' )),
      a.* 
    FROM 
      jupiter1.table a
    ORDER by createtime DESC
    

    这能解决您的问题吗?
    已编辑以包含您的默认条件

    【讨论】:

      猜你喜欢
      • 2018-04-03
      • 2012-10-14
      • 2021-09-30
      • 2016-05-22
      • 2020-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多