4

MySQL是否提供任何验证日期有效性的功能?例如,该DATE函数NULL在提供无效日期 2013-02-30 时返回。但是,我也在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_DATEhaltDATE的功能,是否有一些解决方法来验证使用时日期是否有效STR_TO_DATE(我有义务使用)?

与此同时,我偶然发现了答案:DATE当数据类型已经是“日期”(STR_TO_DATE将字符串转换为日期数据类型)时,该函数显然会跳过一些验证检查。因此,在使用 将日期解析为正确格式后,将日期转换为字符串,就可以STR_TO_DATE了:

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

4

3 回答 3

2

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

'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 prioriSTR_TO_DATE

于 2016-03-01T20:56:00.743 回答
0

我无法清楚地理解您的目的,也许这是一个想法;
SELECT DATE_FORMAT(yourFiled, '%Y-%m-%d') days FROM yourTable GROUP BY days; 这不为空;你可以改变它。有些喜欢

SELECT DATE_FORMAT(yourFiled, '%Y-%m-%d') days FROM  yourTable WHERE yourFiled > '2013-9-23 00:00:00' GROUP By days;
于 2013-09-23T14:50:50.867 回答
0

尝试这个:

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

于 2015-03-16T12:57:54.193 回答