2010-03-16 121 views
1

我一直在做的線沿線的東西..MySQL DATETIME格式比較 - 需要strtotime嗎?

$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需要的?我可以在日期時間格式化的字符串上做更直接的比較嗎?

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

將始終工作?

回答

1

是的,格式爲yyyy-mm-dd hh:ii:ss的字符串lexicographical order按預期工作。你甚至可以排序這樣的日期。

$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 

但請記住,你會得到的是以正確的格式不字符串沒有反饋。所以,如果可能是那裏存在格式錯誤的字符串,那麼最好也檢查一下。如果這不是問題,string1 > string2是好的。

編輯:你甚至可以讓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 
+0

謝謝,我認爲這將工作和使用數組是有道理的。 – Steffan 2010-03-16 21:18:46

+0

添加了「in-mysql」解決方案。 – VolkerK 2010-03-16 22:03:04

1

如果您將日期存儲在字符串中,請使用YYYY-MM-DD HH:MM:SS格式,您可以使用字母順序:它將與日期順序相同。

這意味着字符串的比較將具有與日期比較相同的結果。


我要補充說將有一個優點,不使用UNIX timestamps:這些是限定於前進1970至2038年的範圍內,因爲它們被存儲在32位整數表示自1970-秒數01-01 (取決於你的系統,範圍可能更寬 - 但不是無限的)

+0

範圍/ UNIX時間戳的歷元是一個很好的點,尤其。因爲這個例子包含了離開當前時代的日期(可能是一個錯字=))。 – VolkerK 2010-03-16 20:30:20

+0

剛剛從MySQL datetime頁面上的示例datetime formate中複製的... def不使用這些日期! – Steffan 2010-03-16 21:17:30

0

我通常使用strtotime()來比較日期作爲時間戳值是安全的。

您可以通過編寫一個IF語句並在一箇中打印'statement 1 true'並在另一箇中打印'statement 2 true'來檢查。然後嘗試改變dt1和dt2的值,看看它是如何發揮出來的。

+0

這就是我正在做的,但直覺上我並不認爲這是必要的。 – Steffan 2010-03-16 21:18:04