2016-05-07 3 views
0

Я хотел бы знать, какой из них является лучшим вариантом между datetime и timestamp для обработки в php-mysql.Datetime/Timestamp для обработки в PHP-MySQL

То, что мне нужно сделать, будет в основном: упорядочить по дате в обоих направлениях и выбрать все строки с определенным годом. Возможно ли это?

Можно ли выбрать все строки с определенным годом или месяцем в php-mysql? Например: SELECT * FROM my_table WHERE my_date.year = 2014?

+0

Что такое «лучший», зависит от ситуации и не является полезным общим вопросом, поэтому я удалил эту часть. – poolie

ответ

1

Для оптимальной производительности базы данных, условия использования на голых колонн. Не заверните их в функции. Например, если предположить dtcol является тип данных DATE, DATETIME или TIMESTAMP ...

SELECT t.dtcol 
    FROM mytable t 
    WHERE t.dtcol >= '2014-01-01' 
    AND t.dtcol < '2015-01-01' 

Это также может быть выражено:

WHERE t.dtcol >= '2014-01-01' 
    AND t.dtcol < '2014-01-01' + INTERVAL 1 YEAR 

Если есть индекс с dtcol в качестве ведущего столбца, MySQL может использовать операцию сканирования диапазона индекса.

НЕ сделать это:

WHERE YEAR(t.dtcol) = 2014 

Это заставит MySQL оценить функцию на каждый строку в таблице, и сравнить результат от функции к буквальным.

Вы не заметите разницы в производительности на небольших тестовых таблицах. Но вы заметите это (медленно, болезненно) на больших столах в загруженной системе.


Есть несколько существенных отличий между DATETIME и TIMESTAMP.

DATETIME поддерживает гораздо больший диапазон значений.

В настоящее время TIMESTAMP реализован как 32-разрядные «секунды с начала эпохи» в стиле Unix с диапазоном значений от «1970-01-01 00:00:01» до некоторого времени '2038-01-19'.

1

Вот способ ООП делать то, что вы хотите, ссылки ниже.

namespace Connection; 
class Database 
{ 
    protected $Con; 
    public function __construct() 
    { 
     $this->Con = new PDO("MySQL:host=X;dbname=X", "user", "pass"); 
    } 
    public function GetInstance() 
    { 
     return $this->Con; 
    } 
} 

// end class 

$sql = "SELECT * FROM Table WHERE DATE_FORMAT(Column, %Y) = 2014"; 
use Connection; 
$smpt = ((new Database)->GetInstance() 
         ->Prepare($sql)) 
         ->execute(); 
foreach ($smpt->fetchAll() as $row): 
    echo $row['Column']; 
endforeach; 

Look at this StackOverflow answer for the difference between DateTime and TimeStamp.

Ссылки:

Date Format

+0

Большое спасибо, очень исчерпывающий ответ :) –

+1

Нет проблем, удачи в вашем проекте! – KDOT

+1

Обтекание ссылки столбца в функции в состоянии * отключает MySQL от использования операции сканирования диапазона индекса. A * much * better pattern, с точки зрения производительности базы данных, заключается в использовании условий на голых столбцах. например ** 'WHEREt.dtcol> = '2014-01-01 И t.dtcol <' 2015-01-01'' ** – spencer7593

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