Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.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,我基本上有一个表格,用户在表格中输入了他们的出生日期 年月日(2012年12月1日) 表中的数据有混合错误,一些人的该字段为空,其他人只有单词“DAY-MONTH-YEAR”,其他人有“---”,其他人有“02-12-YEAR”,其他人有“-1985”。我知道。。。可怕的 我现在正在尝试筛选,以便我只在我的查询中得到只以正确格式输入完整DoB的人 我的REGEXP不是很好。。。我想知道是否有人可以帮助我在MySQL中验证日期。我可以在PHP中轻松实现这一点,但我尝试将此过程保留在我的应用程序模型

我基本上有一个表格,用户在表格中输入了他们的出生日期

年月日(2012年12月1日)

表中的数据有混合错误,一些人的该字段为空,其他人只有单词“DAY-MONTH-YEAR”,其他人有“---”,其他人有“02-12-YEAR”,其他人有“-1985”。我知道。。。可怕的

我现在正在尝试筛选,以便我只在我的查询中得到只以正确格式输入完整DoB的人

我的REGEXP不是很好。。。我想知道是否有人可以帮助我在MySQL中验证日期。我可以在PHP中轻松实现这一点,但我尝试将此过程保留在我的应用程序模型中

SELECT m_dob FROM `mariners` WHERE m_dob IS NOT NULL AND m_dob != '' and m_dob != 'Day-Month-Year' AND m_dob != '--' AND m_dob REGEXP '^1[() -]*[[:digit:]]{3}[() -]*[[:digit:]]{3}[() -]*[[:digit:]]{4}$';

避免使用正则表达式的痛苦,只需调用MySQL函数即可:

SELECT m_dob FROM mariners WHERE STR_TO_DATE(m_dob, '%d-%b-%Y') IS NOT NULL
如手册所述:

如果从
str
提取的日期、时间或日期时间值非法,则返回
NULL
,并产生警告


更新 正如您在评论中所指出的,在某些情况下可能返回零日期。要避免这种情况,请执行以下操作之一:

  • 启用SQL模式:

    SET SESSION sql_mode = 'NO_ZERO_DATE'
    
  • 或者使用其他功能,如验证日期的有效性:

    SELECT m_dob
    FROM   mariners
    WHERE  TO_DAYS(STR_TO_DATE(m_dob, '%d-%b-%Y')) IS NOT NULL
    

我不建议手动捕获可能导致零日期的输入日期的所有实例,因为很可能会忽略其他一些特殊情况。

避免使用正则表达式的痛苦,只需调用MySQL函数即可:

SELECT m_dob FROM mariners WHERE STR_TO_DATE(m_dob, '%d-%b-%Y') IS NOT NULL
如手册所述:

如果从
str
提取的日期、时间或日期时间值非法,则返回
NULL
,并产生警告


更新 正如您在评论中所指出的,在某些情况下可能返回零日期。要避免这种情况,请执行以下操作之一:

  • 启用SQL模式:

    SET SESSION sql_mode = 'NO_ZERO_DATE'
    
  • 或者使用其他功能,如验证日期的有效性:

    SELECT m_dob
    FROM   mariners
    WHERE  TO_DAYS(STR_TO_DATE(m_dob, '%d-%b-%Y')) IS NOT NULL
    

我不建议手动捕获可能导致零日期的输入日期的所有实例,因为很可能会忽略其他一些特殊情况。

谢谢。所有这些奇特的正则表达式匹配起来更容易。虽然这并没有过滤前面提到的情况,但是那些有空格的是空的,意思是=“”。正确的查询是:请修改您的答案
从水手中选择m_dob,其中STR_TO_DATE(m_dob,%d-%b-%Y')不为空且m_dob!=“”谢谢。所有这些奇特的正则表达式匹配起来更容易。虽然这并没有过滤前面提到的情况,但是那些有空格的是空的,意思是=“”。正确的查询是:请修改您的答案
从水手中选择m_dob,其中STR_TO_DATE(m_dob,%d-%b-%Y')不为空且m_dob!=“”