MySQL DATETIME biçimi karşılaştırma - strtotime gereklidir?

3 Cevap php

Ben çizgisinde bir şey yapıyorum ..

$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 gerekli midir? i datetime biçimlendirilmiş dizeleri daha doğrudan bir karşılaştırma yapabilirim?

yani

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

Bu her zaman işe yarayacak mı?

3 Cevap

Amaçlanan gibi Evet, lexicographical order biçiminde dizeleri yyyy-mm-dd hh:ii:ss çalışır. Hatta böyle tarihleri ​​sıralamak olabilir.

$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";
}

baskılar

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

Ama doğru biçimde not olan dizeleri için hiçbir geri bildirim alacaksınız unutmayın. Yani, daha çok kontrol ediyorum biçimlendirilmiş dizeleri varsa o could be söyledi. Bir endişe değilse, dize1> dize2 ok.

edit: Hatta MySQL işi yapalım olabilir. Bu daha iyidir / php bunu yapıyor daha kötü / eşit aslında başarmak için çalışıyoruz bağlıdır. Örneğin

$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";
}

baskılar

- 1000-01-01 00:00:00
+ 2010-03-16 21:22:19
- 1000-01-01 00:00:10
+ 1976-03-27 05:55:00

Eğer YYYY-MM-DD HH:MM:SS biçimini kullanarak, dize depolanan tarihleri ​​varsa, alphabetical order kullanabilirsiniz: bu tarihler sipariş olarak aynı olacak.

Hangi dizeleri karşılaştırmalar tarihlerde karşılaştırmalar gibi aynı sonucu var anlamına gelir.


I would add that there would be an advantage in not using UNIX timestamps : those are limited to a range that goes from 1970 to 2038, as they are stored on 32 bits integers that represent a number of seconds since 1970-01-01 (depending on your system, the range might be wider -- but not unlimited)

Ben genellikle (), bir zaman damgası değeri olarak tarihlerini karşılaştırarak güvenli olması için strtotime kullanın.

Sen bir ve diğer 'gerçek bir ifadedir 2' de IF ve baskı 'deyimi 1 gerçek' hem de yazarak kontrol edebilirsiniz. Sonra dt1 ve DT2 değerlerini değiştirmeyi deneyin ve ortaya nasıl oynadığını görmek.