MySQL:如何检查字符串是否为有效的DATE,TIME或DATETIME

Svi*_*ish 19 php mysql validation datetime

当我尝试将值放入无效的DATE字段时,MySQL似乎使用了0000-00-00.有没有办法在没有更新DATE字段的情况下"检查"?并从例如PHP做到这一点?

比如,有没有办法可以查询MySQL服务器并询问"嘿,这个DATE,TIME或DATETIME对你有效吗?"

或者是否有更好的方法呢?

Abb*_*bas 7

我在我的应用程序中使用这种语法,它的工作就像魅力一样!

SELECT DATE('2013-09-31') AS valid;
Run Code Online (Sandbox Code Playgroud)

我的系统是Win7x64,PHP 5.5和MySQL 5.6.16


wim*_*vds 6

您可以根据要使用的格式解析日期,然后调用checkdate来测试它是否是有效日期.请务必阅读http://php.net/manual/en/function.checkdate.php上的评论.


Bas*_*MHL 5

由于问题说明MySQL,这里是一个MySQL解决方案:

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

'yyyy-mm-dd'
'yyyy-mm-dd hh:mm:ss'
'yyyy-mm-dd whatever'
Run Code Online (Sandbox Code Playgroud)

此代码将帮助您:

 SELECT count(*) FROM `table` 
 WHERE DATE(STR_TO_DATE(`column`, '%Y-%m-%d')) IS NOT NULL
 AND `column` NOT REGEXP '^[0-9\.]+$'
Run Code Online (Sandbox Code Playgroud)

基本上 :

  • 第一个条件告诉你 if 是一个日期,但不幸的是不排除数字(例如: DATE(STR_TO_DATE(**1**, '%Y-%m-%d')) = '2001-00-00'
  • 第二个确保排除数字,这使您只能获得遵循上述格式的日期。

如果count(*)>0,那就是约会,如果是,0那就是别的东西。

注意 此方法适用于任何日期格式的字符串,只要您事先知道它们遵循什么格式(我知道情况并非总是如此,但仍然有用)。只需替换a priori查询中的格式


Vol*_*erK 3

如果您为 MySQL 服务器选择不允许无效日期值的服务器模式,则包含此类格式错误的日期表示形式的查询将导致错误,而不是(默默地)假设 0000-00-00 请参阅
http ://dev.mysql。 com/doc/refman/5.0/en/server-sql-mode.html

例如

$pdo = new PDO('mysql:host=localhost;dbname=test', 'localonly', 'localonly'); 
$pdo->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );

$pdo->exec('CREATE TEMPORARY TABLE foo (id int auto_increment, d datetime, primary key(id))');

$query = "INSERT INTO foo (d) VALUES ('2010-02-31 12:15:18')";
foreach( array('ALLOW_INVALID_DATES', 'STRICT_ALL_TABLES') as $mode ) {
  echo $mode, ": "; flush();
  $pdo->exec("SET SESSION sql_mode='$mode'");
  $pdo->exec($query);
  echo "Ok.\n";
}
Run Code Online (Sandbox Code Playgroud)

印刷

ALLOW_INVALID_DATES: Ok.
STRICT_ALL_TABLES: 
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[22007]: Invalid datetime format: 1292 Incorrect datetime value: '2010-02-31 12:15:18' for column 'd' at row 1' in [...]
Run Code Online (Sandbox Code Playgroud)