Mysql 选择与日期格式不匹配的所有行?
我正在尝试迁移/更新一个旧表,该表允许在假定的“日期”字段中使用可为空的varchar。我要查找与此格式不匹配的所有行:Mysql 选择与日期格式不匹配的所有行?,mysql,sql,Mysql,Sql,我正在尝试迁移/更新一个旧表,该表允许在假定的“日期”字段中使用可为空的varchar。我要查找与此格式不匹配的所有行:%e-%b-%y。如何完成此查询 **编辑:我应该提到,该字段确实包含一些“已取消”、null或其他字符串值,而不是更常见的e-b-y格式。我正在查找这些行,以便将它们更新为所需的格式(%e-%b-%y)。您可以在MySQL中使用正则表达式;看 下面是一个表达式,它返回日期字段(dt)为空或与1-2位+破折号+3个字母字符+破折号+2位不匹配的行(例如,06-Sep-13) 这
%e-%b-%y
。如何完成此查询
**编辑:我应该提到,该字段确实包含一些“已取消”、null或其他字符串值,而不是更常见的e-b-y格式。我正在查找这些行,以便将它们更新为所需的格式(%e-%b-%y)。您可以在MySQL中使用正则表达式;看 下面是一个表达式,它返回日期字段(dt)为空或与1-2位+破折号+3个字母字符+破折号+2位不匹配的行(例如,06-Sep-13) 这是基于。您可以执行以下操作:
SELECT * FROM my_table
WHERE DATE_FORMAT(CAST(date_field, DATE), '%e-%b-%y') <> date_field
从my_表中选择*
其中日期格式(转换(日期字段,日期),“%e-%b-%y”)日期字段
它的作用是获取date_字段,尝试将其转换为日期,然后将该日期转换回字符串,并与原始字符串进行比较。如果两者不匹配,则报告该行。如果转换失败,您的MySQL客户端可能会报告警告,但您可以安全地忽略这些警告
这是一个非常严格的检查:它将报告任何一行,如果您无法通过相应地格式化日期来准确地重新创建原始情况。特别是,这会抱怨前导零、尾随空格等方面的差异。如果这是一个问题,您可以找到一个不太严格的检查(可能基于日期有效性检查并结合一些正则表达式),或者执行一些简单的模式匹配来识别和更正这些行,以便它们匹配所需的格式。像查找所有与
\uu-\ u-\ uu-\ uu-
匹配的行,并在第一个破折号后引入0
。另一种方法是尝试使用STR\u to\u DATE()
以不同的格式恢复尽可能多的日期,如果提取的值无效且合并(),则返回NULL
)
链接不同的日期格式
要仅显示日期不可恢复的行,请执行以下操作:
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;
要查看转换日期后您将得到什么:
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;
注意:
- 您可以根据需要链接任意多的格式字符串
- 在两位数前使用四位数格式
。否则你会得到错误的日期%y
下面是演示如何将它们转换为
日期
,然后将其转换为该格式,并检查它们是否匹配。例如,从my_表中选择*日期格式(CAST(日期字段,日期),“%e-%b-%y”)日期字段
究竟为什么有人否决了这个?看不到任何合理的理由。是的,但这就是为什么你要像我说的那样进行反向转换,从没有起作用的地方提取它起作用的地方。@Orbling:你最初评论的建议听起来很合理,你愿意把这个问题作为一个答案,这样我就可以提高投票率了吗?@MvG:没有时间来充实它-请随意。你和@Orbling的联合回答都帮了我的忙!谢谢你!谢谢你!结合以上内容,帮助我找到需要查找的字段。而且,我无法让它在执行Cast(date_字段,date)时工作。我必须使用Case(date\u字段作为date)。
| ID | DT | NEW_DATE |
|----|-------------|----------------------------------|
| 1 | CANCELLED | (null) |
| 2 | 02-Mar-12 | March, 02 2012 00:00:00+0000 |
| 3 | (null) | (null) |
| 4 | 5-Aug-13 | August, 05 2013 00:00:00+0000 |
| 5 | | (null) |
| 6 | 2013-09-12 | September, 12 2013 00:00:00+0000 |
| 7 | 10/23/2013 | October, 23 2013 00:00:00+0000 |
| 8 | 13-Aug-2012 | August, 13 2012 00:00:00+0000 |