1

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

日-月-年(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}$';
4

1 回答 1

7

从使用正则表达式的痛苦中解脱出来,只需调用 MySQL 的STR_TO_DATE()函数即可:

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

如手册中所述:

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


更新

如您的评论中所述,在某些情况下STR_TO_DATE()可以返回零日期。为了避免这种情况,要么:

  • 启用NO_ZERO_DATESQL 模式:

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

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

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

于 2013-03-15T10:30:51.383 回答