Как проверить, является ли строкой допустимая ДАТА, ВРЕМЯ или ДАТА И ВРЕМЯ

Когда я пытаюсь поместить значение в Поле даты, которое недопустимо, MySQL, кажется, использует 0000-00-00 вместо этого. Существует ли способ, которым я могу сделать эту "проверку", не обновляя Поле даты? И сделать это от, например, PHP?

Как, там способ, которым я могу запросить сервер MySQL и спросить "Эй, эта ДАТА, ВРЕМЯ или ДАТА И ВРЕМЯ, допустимая Вам?"

Или есть ли, возможно, еще лучший способ сделать его?

19
задан Braiam 6 November 2019 в 13:11
поделиться

4 ответа

Если вы выберете режим сервера для сервера 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";
}

отпечатки

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 [...]
2
ответ дан 30 November 2019 в 04:24
поделиться

Вы можете проанализировать дату в соответствии с форматом, который вы хотите использовать, а затем вызвать checkdate, чтобы проверить, является ли это допустимой датой. Обязательно прочтите комментарии к http://php.net/manual/en/function.checkdate.php .

6
ответ дан 30 November 2019 в 04:24
поделиться

Используйте эту функцию в php для проверки действительной даты:

function valid_date($date) {
    return (preg_match("/^([0-9]{4})-([0-9]{2})-([0-9]{2})$/", $date));
}

Или, как сказал @VolkerK, если в базу данных будет вставлена ​​недопустимая дата, она будет хранится как 0000-00-00, поэтому вы также можете:

ВЫБРАТЬ * ИЗ таблицы WHERE date_field> '0000-00-00'

0
ответ дан 30 November 2019 в 04:24
поделиться

Вы можете просто использовать «постоянный» запрос без использования временных таблиц и тестовых полей:

mysql> select day('2010-02-31 00:00:00');
+----------------------------+
| day('2010-02-31 00:00:00') |
+----------------------------+
|                       NULL | 
+----------------------------+
4
ответ дан 30 November 2019 в 04:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: