2010-03-16 4 views
1

я делал что-то вдоль линий ..Сравнение формата DATETIME MySQL - требуется 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? могу ли я сделать более прямое сравнение с строками в формате datetime?

т.е.

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

Будет ли всегда работать?

ответ

1

Да, lexicographical order строк в формате 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 в порядке.

Редактировать: Вы могли бы даже позволить 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

+0

добавлено решение «in-mysql». – VolkerK

1

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

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


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

+0

Диапазон/эпоха Unix меток времени является хорошей точкой, ESP. поскольку пример состоит из дат, которые являются выходными из текущей эпохи (может быть, опечатка хотя =]). – VolkerK

+0

просто скопирован из примера datetime formate на странице MySQL datetime ... def не использует эти даты! – Steffan

0

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

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

+0

Это то, что я делал, но интуитивно я не думал, что это необходимо. – Steffan

Смежные вопросы