2013-09-23 37 views
4

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

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功能跳过一些验证检查,当数据类型已经是“日期”(STR_TO_DATE将字符串转换为日期数据类型)的。因此,在将日期解析为与STR_TO_DATE正确的格式之后将日期转换为字符串,是否有诀窍:

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

+0

中的格式a priori请提供更多的上下文:您尝试验证的数据流是什么? – wallyk

+0

@wallyk可以任意格式化的日期应该首先传递给STR_TO_DATE函数及其格式,并且应该有效验证其有效性。刚刚解决了问题,请参阅编辑。 – user2180613

+0

如果您从某个数据库字段中提取日期,则您已经知道它是NULL或有效。你为什么要验证它? – wallyk

回答

0

我不明白你的目的,也许这是一个想法;
SELECT DATE_FORMAT(yourFiled,'%Y-%m-%d')days FROM yourTable GROUP GROUP BY days; 这不是null;你可以改变它。有的喜欢

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

试试这个:

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

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这是别的东西。

注意 这种方法,只要你知道适用于任何日期格式的字符串事先他们遵循什么样的格式(这是我所知道的是并非总是如此,但仍然有用)。只需更换STR_TO_DATE