验证MySQL中的时间格式有效性

时间:2013-09-14 20:59:10

标签: mysql sql database time

我一直在寻找MySQL's date and time functions page很长一段时间,但是我找不到一个能够指示时间格式是否有效的函数,例如,STR_TO_DATE函数。用户提供格式,我希望尽可能广泛地接受格式。该格式可以在稍后的脚本中与MySQL的STR_TO_DATE函数一起使用,该函数在失败时返回NULL(这是我想要避免的,通过在用户提供无效时间格式时预警用户)。我打算在临时表的帮助下以某种方式测试格式。

我无法使用STR_TO_DATE函数测试格式的有效性,因为传递给它的字符串值最终将由用户生成(在未来未定义的时间点),所以我不知道哪些字符串将被传递给它。我原本希望DATE_FORMAT函数可以解决我的问题,但它只是忽略了任何无效的格式说明符(例如,%Q表示什么都没有,并将转换为Q)。在任何情况下都不会返回NULL,也不会产生警告。

有什么想法吗?

编辑:我能提出的唯一可靠的解决方案是列出所有MySQL支持的格式说明符,并将其与用户提供的格式中的所有格式说明符进行比较。

preg_match_all("/(?:(?<!%)|(?<=%%))(?:%%)*%([^%])/", $format, $matches);

正则表达式列出了所有以奇数百分号符号出现的字符。 (这是必要的,因为百分号会自行逃脱。)现在$matches[1]包含这些字符的列表。

3 个答案:

答案 0 :(得分:0)

如果你想知道字符串是否只包含有效的说明符,那么创建一个32格式说明符的列表......

a, b, c, d, D, e, f, h, H, i, I, j, k, l, m, M, p, r, s, S, T, u, U, v, V, w, W, x, X, y, Y, %

然后遍历格式字符串并检查有效的说明符......

// pseudo-code... pretend format is an array of the format's characters
function is_valid_format(format) {
  for (x = 0; x < format.length; ++x) 
    if (format[x] == "%" &&
        (x + 1 >= format.length || 
        specifiers does not contain format[x + 1])
      return false

  return true
}

您还可以考虑提供用户可以选择的预设日期格式字符串列表。除非用户记住了他们的格式字符串或记住了说明符,否则我更倾向于选择日期格式字符串。

答案 1 :(得分:0)

使用Jquery验证引擎验证客户端的日期格式。

从PHP中,您可以将日期(MySQL日期格式'2013-09-14')验证为

if(preg_match("/^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[1-2][0-9]|3[0-1])$/",$date)) {
    return true;
}

答案 2 :(得分:0)

可以使用MySQL触发器实现。

DELIMITER //
CREATE TRIGGER mytrigger BEFORE INSERT ON table_name
FOR EACH ROW BEGIN
IF (NEW.date_column REGEXP '^[0-9]{4}-[0-9]{2}-[0-9]{2}$') = 0 THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT='Wrong Input';
END IF;
END //

DELIMITER;

如果用户输入为与指定的格式不同。

可以根据需要调整正则表达式。