如何在MySQL中验证日期还有字母数字的日期

时间:2013-03-15 10:27:57

标签: 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}$';

1 个答案:

答案 0 :(得分:4)

避免使用正则表达式的痛苦,而只需调用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_DATE SQL模式:

    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
    

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