Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 选择与日期格式不匹配的所有行?_Mysql_Sql - Fatal编程技术网

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

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) 这

我正在尝试迁移/更新一个旧表,该表允许在假定的“日期”字段中使用可为空的varchar。我要查找与此格式不匹配的所有行:
%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
    。否则你会得到错误的日期
如果您有以下样本数据:

| ID | DT | |----|-------------| | 1 | CANCELLED | | 2 | 02-Mar-12 | | 3 | (null) | | 4 | 5-Aug-13 | | 5 | | | 6 | 2013-09-12 | | 7 | 10/23/2013 | | 8 | 13-Aug-2012 | |ID|DT| |----|-------------| |1 |取消| |2012年3月2日| |3 |(空)| |2013年8月4日至5日| | 5 | | | 6 | 2013-09-12 | | 7 | 10/23/2013 | |2012年8月13日| 然后,第二个查询生成以下输出:

| 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 | |ID | DT |新日期| |----|-------------|----------------------------------| |1 |取消|(空)| |2012年3月2日00:00:00+0000| |3 |(空)|(空)| |2013年8月5日00:00:00+0000| |5 | |(空)| |2013年9月12日00:00:00+0000| |2013年10月23日7 | 2013年10月23日00:00:00+0000| |8 | 2012年8月13日| 2012年8月13日00:00:00+0000|
下面是演示

如何将它们转换为
日期
,然后将其转换为该格式,并检查它们是否匹配。例如,
从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 |