Сравнение формата MySQL DATETIME - нужно ли strtotime? - PullRequest
1 голос
/ 16 марта 2010

Я делал что-то вроде ..

$dt1 = '1000-01-01 00:00:00'; //really some val from db
$dt2 = '1000-01-01 00:00:10'; //another val maybe db maybe formatted

if(strtotime($dt1) > strtotime($dt2){
//do something
}

Нужно ли strtotime? Могу ли я сделать более прямое сравнение строк в формате datetime?

т.е.

if($dt1 > $dt2){
//do something
}

Это всегда будет работать?

Ответы [ 3 ]

1 голос
/ 16 марта 2010

Да, лексикографический порядок строк в формате yyyy-mm-dd hh:ii:ss работает как задумано. Вы могли бы даже сортировать такие даты.

$dts = array(
  '1000-01-01 00:00:00',
  '2010-03-16 21:22:19',
  '1000-01-01 00:00:10',
  '1976-03-27 05:55:00', 
  '1976-03-27 05:54:00',
  '1968-08-21 12:00:00',
  '2001-01-01 00:00:01'
);

sort($dts);
foreach($dts as $dt) {
  echo $dt, "\n";
}

печать

1000-01-01 00:00:00
1000-01-01 00:00:10
1968-08-21 12:00:00
1976-03-27 05:54:00
1976-03-27 05:55:00
2001-01-01 00:00:01
2010-03-16 21:22:19

Но имейте в виду, что вы не получите обратной связи для строк, которые не в правильном формате. Так что, если может быть , что есть неправильно сформированные строки, вам лучше это проверить. Если это не проблема, строка1> строка2 в порядке.

edit: Вы могли бы даже позволить MySQL сделать всю работу. Если это лучше / равно / хуже, делать это в php зависит от того, чего вы на самом деле пытаетесь достичь. Э.Г.

$pdo = new PDO("mysql:host=localhost;dbname=test", 'localonly', 'localonly'); 
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// setting up a sample table with some values
$pdo->exec('CREATE TEMPORARY TABLE foo (id int auto_increment, d datetime NOT NULL, primary key(id))');
$pdo->exec("INSERT INTO foo (d) VALUES ('1000-01-01 00:00:00'),('2010-03-16 21:22:19'),('1000-01-01 00:00:10'),('1976-03-27 05:55:00')");


$query = "
  SELECT
    d,
    (d>'1910-03-17 12:00:00') as flag
  FROM
    foo
";

foreach ( $pdo->query($query) as $row ) {
  echo $row['flag'] ? '+ ':'- ', $row['d'], "\n";
}

печать

- 1000-01-01 00:00:00
+ 2010-03-16 21:22:19
- 1000-01-01 00:00:10
+ 1976-03-27 05:55:00
1 голос
/ 16 марта 2010

Если даты хранятся в виде строки в формате YYYY-MM-DD HH:MM:SS, вы можете использовать в алфавитном порядке *1003*: он будет таким же, как порядок дат.

Это означает, что сравнения по строкам будут иметь тот же результат, что и сравнения по датам.


Я бы добавил, что было бы преимуществом не использовать метки времени UNIX : они ограничены диапазоном от 1970 до 2038 года, так как они хранятся в 32-битных целых числах, которые представляют количество секунд с 1970 -01-01 (в зависимости от вашей системы диапазон может быть шире, но не безграничен)

0 голосов
/ 16 марта 2010

Я обычно использую strtotime (), чтобы безопасно сравнивать даты как значение метки времени.

Вы можете проверить, написав как операторы IF, так и напечатав «Statement 1 true» в одном и «Statement 2 True» в другом. Затем попробуйте изменить значения dt1 и dt2 и посмотрите, как это закончится.

...