【问题标题】:Datetime / Timestamp to be handled in PHP-MySQL [closed]要在 PHP-MySQL 中处理的日期时间/时间戳 [关闭]
【发布时间】:2016-05-07 12:48:30
【问题描述】:

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

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

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

【问题讨论】:

  • 什么是“最好的”视情况而定,不是一个有用的一般问题,所以我删除了那部分。

标签: php mysql datetime timestamp unix-timestamp


【解决方案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-01-19'。

【讨论】:

    【解决方案2】:

    这是一种做你想做的 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

    【讨论】:

    • 非常感谢,非常详尽的回答:)
    • 没问题,祝你的项目好运!
    • 在一个条件下将列引用包装在一个函数中禁用 MySQL 使用索引范围扫描操作。就数据库性能而言,更好 的模式是在裸列上使用条件。例如WHEREt.dtcol &gt;= '2014-01-01 AND t.dtcol &lt; '2015-01-01'
    • 我假设 OP 只想匹配 Year,尽管就 SQL 查询而言这将是一个更好的解决方案。不错的补充@spencer7593
    猜你喜欢
    • 2011-03-20
    • 2013-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-05
    • 1970-01-01
    相关资源
    最近更新 更多