MySQL日期有效性

时间:2013-09-23 14:35:43

标签: mysql sql function date time

MySQL是否提供验证日期有效性的任何功能?例如,在提供无效日期2013-02-30时,DATE函数返回NULL。但是,我也同时使用STR_TO_DATE,这会神秘地阻止DATE无法正常工作。

SELECT DATE('2013-02-30'); NULL
SELECT STR_TO_DATE('2013-02-30', '%Y-%m-%d'); NOT NULL
SELECT DATE('2013-02-40'); NULL
SELECT STR_TO_DATE('2013-02-40', '%Y-%m-%d'); NULL
SELECT DATE(STR_TO_DATE('2013-02-30', '%Y-%m-%d')); NOT NULL

为什么STR_TO_DATE暂停DATE的功能,是否有一些解决方法可以在使用STR_TO_DATE(我有义务使用)时验证日期是否有效?

我在此期间偶然发现了答案:显然DATE函数跳过了一些验证检查,当数据类型已经是' date' (STR_TO_DATE将字符串转换为日期数据类型)。因此,在使用STR_TO_DATE将日期解析为正确的格式后,将日期转换为字符串,可以解决问题:

@valid_date = NOT ISNULL(DATE(CONVERT(STR_TO_DATE('2013-02-29', '%Y-%m-%d'), CHAR)))

3 个答案:

答案 0 :(得分:1)

由于需要考虑所有不同的可能日期格式,因此很难验证字段是否为日期。但如果您知道字段日期格式是以下之一:

'yyyy-mm-dd'
'yyyy-mm-dd hh:mm:ss'
'yyyy-mm-dd whatever'

此代码可以帮助您:

 SELECT count(*) FROM `table` 
 WHERE DATE(STR_TO_DATE(`column`, '%Y-%m-%d')) IS NOT NULL
 AND `column` NOT REGEXP '^[0-9\.]+$'

基本上:

  • 第一个条件告诉您是否是日期,但遗憾的是不排除数字(例如DATE(STR_TO_DATE(**1**, '%Y-%m-%d')) = '2001-00-00'
  • 第二个确保排除数字,只留下符合上述格式的日期。

如果count(*)>0,则表示日期,如果是0则为其他日期。

注意 只要您事先知道它们遵循的格式(我知道情况并非总是如此但仍然有用),此方法适用于任何日期格式的字符串。只需替换a priori

中的格式STR_TO_DATE即可

答案 1 :(得分:0)

我无法清楚地理解你的目的,也许这是一个想法;
 从yourTable GROUP BY天中选择DATE_FORMAT(yourFiled,'%Y-%m-%d')天数; 这不是空的;你可以改变它。有些像

SELECT DATE_FORMAT(yourFiled, '%Y-%m-%d') days FROM  yourTable WHERE yourFiled > '2013-9-23 00:00:00' GROUP By days;

答案 2 :(得分:0)

试试这个:

SELECT DATE(STR_TO_DATE('2013-00-30', '%Y-%m-%d')); --is also NOT NULL