我基本上有一个表格,用户在表格中以格式输入了他们的出生日期。
DAY-MONTH-YEAR(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}$';
Run Code Online (Sandbox Code Playgroud)
使您免于使用正则表达式的麻烦,而只需调用MySQL的STR_TO_DATE()函数即可:
SELECT m_dob FROM mariners WHERE STR_TO_DATE(m_dob, '%d-%b-%Y') IS NOT NULL
Run Code Online (Sandbox Code Playgroud)
如手册中所述:
如果从中提取的日期,时间或日期时间值不
str合法,则STR_TO_DATE()返回NULL并产生警告。
如您的评论中所述,在某些情况下STR_TO_DATE()可以返回零日期。为避免这种情况,请执行以下任一操作:
启用NO_ZERO_DATESQL模式:
SET SESSION sql_mode = 'NO_ZERO_DATE'
Run Code Online (Sandbox Code Playgroud)或者使用其他功能TO_DAYS来验证日期的有效性:
SELECT m_dob
FROM mariners
WHERE TO_DAYS(STR_TO_DATE(m_dob, '%d-%b-%Y')) IS NOT NULL
Run Code Online (Sandbox Code Playgroud)我不建议手动尝试捕获所有可能导致零日期输入日期的实例,因为很可能会忽略其他一些极端情况。