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)))
。
答案 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