选择所有与日期格式不匹配的行?

Caj*_*ian 6 mysql sql

我正在尝试迁移/更新一个旧表,该表允许在假定的“日期”字段中使用可为空的 varchar。我想找到所有与此格式不匹配的行:%e-%b-%y. 我怎样才能完成这个查询?

**编辑:我应该提到该字段确实包含一些“CANCELLED”、null 或其他字符串值,而不是更常见的 eby 格式。我正在寻找这些行,以便我可以将它们更新为我想要的格式 (%e-%b-%y)。

pet*_*erm 1

另一种方法是尝试使用不同的格式恢复尽可能多的日期,如果提取的值无效,则使用STR_TO_DATE()该格式返回并链接不同的日期格式。NULLCOALESCE()

仅显示日期不可恢复的行:

SELECT *
  FROM table1
 WHERE COALESCE(STR_TO_DATE(NULLIF(dt, ''), '%e-%b-%Y'),
                STR_TO_DATE(NULLIF(dt, ''), '%e-%b-%y'),
                STR_TO_DATE(NULLIF(dt, ''), '%Y-%m-%d'),
                STR_TO_DATE(NULLIF(dt, ''), '%m/%d/%Y'),
                STR_TO_DATE(NULLIF(dt, ''), '%m/%d/%y')) IS NULL;
Run Code Online (Sandbox Code Playgroud)

要查看转换日期后会得到什么:

SELECT *, COALESCE(STR_TO_DATE(NULLIF(dt, ''), '%e-%b-%Y'),
                   STR_TO_DATE(NULLIF(dt, ''), '%e-%b-%y'),
                   STR_TO_DATE(NULLIF(dt, ''), '%Y-%m-%d'),
                   STR_TO_DATE(NULLIF(dt, ''), '%m/%d/%Y'),
                   STR_TO_DATE(NULLIF(dt, ''), '%m/%d/%y')) new_date
  FROM table1;
Run Code Online (Sandbox Code Playgroud)

笔记:

  • 您可以根据需要链接尽可能多的格式字符串。
  • %y在两位数字之前使用四位数字格式%y。否则你会得到不正确的日期。

如果您有以下示例数据:

| 身份证 | DT |
|----|-------------|
| 1 | 取消 |
| 2 | 2012 年 3 月 2 日 |
| 3 | (空)|
| 4 | 2013 年 8 月 5 日 |
| 5 | |
| 6 | 2013-09-12 |
| 7 | 2013 年 10 月 23 日 |
| 8 | 2012 年 8 月 13 日 |

然后第二个查询产生以下输出:

| 身份证 | DT | 新日期 |
|----|-------------|---------------------------- ----|
| 1 | 取消 | (空)|
| 2 | 2012 年 3 月 2 日 | 2012 年 3 月 2 日 00:00:00+0000 |
| 3 | (空)| (空)|
| 4 | 2013 年 8 月 5 日 | 2013 年 8 月 5 日 00:00:00+0000 |
| 5 | | (空)|
| 6 | 2013-09-12 | 2013 年 9 月 12 日 00:00:00+0000 |
| 7 | 2013 年 10 月 23 日 | 2013 年 10 月 23 日 00:00:00+0000 |
| 8 | 2012 年 8 月 13 日 | 2012 年 8 月 13 日 00:00:00+0000 |

这是SQLFiddle演示