我正在尝试迁移/更新一个旧表,该表允许在假定的“日期”字段中使用可为空的 varchar。我想找到所有与此格式不匹配的行:%e-%b-%y. 我怎样才能完成这个查询?
**编辑:我应该提到该字段确实包含一些“CANCELLED”、null 或其他字符串值,而不是更常见的 eby 格式。我正在寻找这些行,以便我可以将它们更新为我想要的格式 (%e-%b-%y)。
另一种方法是尝试使用不同的格式恢复尽可能多的日期,如果提取的值无效,则使用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演示