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

MySQL中时间格式有效性的验证,mysql,sql,database,time,Mysql,Sql,Database,Time,我已经四处寻找了很长一段时间了,但是我没有找到一个函数来指示时间格式是否可以在STR_to_DATE函数中使用。用户提供一种格式,我希望接受尽可能广泛的格式。该格式可能会在以后的脚本中与MySQL的STR_TO_DATE函数结合使用,该函数在失败时返回NULL,这是我希望避免的,当用户提供无效的时间格式时,会对其发出警告。我打算借助一个临时表以某种方式测试这些格式 我无法通过使用STR_TO_DATE函数来测试格式的有效性,因为将传递给它的字符串值最终将由用户在未定义的时间点生成,因此我不知道将

我已经四处寻找了很长一段时间了,但是我没有找到一个函数来指示时间格式是否可以在STR_to_DATE函数中使用。用户提供一种格式,我希望接受尽可能广泛的格式。该格式可能会在以后的脚本中与MySQL的STR_TO_DATE函数结合使用,该函数在失败时返回NULL,这是我希望避免的,当用户提供无效的时间格式时,会对其发出警告。我打算借助一个临时表以某种方式测试这些格式

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

有什么想法吗

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


preg_match_all/?:?如果要知道字符串是否只包含有效的说明符,请创建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
}
然后遍历格式字符串并检查有效的说明符

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
}

<>你也可以考虑提供一个用户可以选择的预设日期格式字符串列表。除非用户记住了格式字符串或说明符,否则我更喜欢选择日期格式字符串

使用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;
}

可以使用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;
这是一个示例集,它将检查格式为YYYY-MM-DD的用户输入,如果用户输入与指定的格式不同,将抛出错误输入消息


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

在插入数据库之前,只需使用一些日期格式。如果插入错误的格式,您将得到error@s.d用户在将任何日期插入数据库之前提供日期格式。这些时刻可能相差几秒钟,但也可能是几周。因此,我确实打算在提供日期格式时立即警告用户。