在 PHP-MySQL 中处理的日期时间/时间戳

Datetime / Timestamp to be handled in PHP-MySQL

我想知道 datetimetimestamp 之间哪一个是最好的选择,以便在 php-mysql 中处理。

我需要做的事情基本上是:双向按日期排序,select 特定年份的所有行。有可能吗?

我可以 select php-mysql 中具有特定年份或月份的所有行吗?例如 SELECT * FROM my_table WHERE my_date.year = 2014

这里有一个 OOP 方法来做你想做的事情,参考如下。

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 Whosebug answer for the difference between DateTime and TimeStamp.

参考文献:

Date Format

为获得最佳数据库性能,请在裸列 上使用条件。不要将它们包装在函数中。例如,假设 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 对 table 中的每个 行的 计算函数,并将函数的结果与文字进行比较。

在小型测试 table 上您不会注意到任何性能差异。但是您会在繁忙的系统中的大型 table 上注意到它(以一种缓慢而痛苦的方式)。


DATETIME 和 TIMESTAMP 之间存在一些显着差异。

DATETIME 支持更大范围的值。

目前,TIMESTAMP 实现为 Unix 风格的 32 位 "seconds since the beginning of the epoch",其值范围从“1970-01-01 00:00:01”到“2038-”的某个时间01-19'.