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

时间:2016-05-07 12:48:30

标签: php mysql datetime timestamp unix-timestamp

我想知道在{-1}}和datetime之间哪一个是在php-mysql中处理的最佳选择。

我需要做的事情基本上是:按日期排序,并选择具有特定年份的所有行。它甚至可能吗?

我可以在php-mysql中选择具有特定年份或月份的所有行吗?就像timestamp一样?

2 个答案:

答案 0 :(得分:1)

这是一种做你想做的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 StackOverflow answer for the difference between DateTime and TimeStamp.

<强>参考文献:

Date Format

答案 1 :(得分: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被实现为Unix风格的32位“自纪元开始以来的秒数”,其中一系列值从'1970-01-01 00:00:01'上升到一段时间后' 2038年1月19' 日。