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