首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 與 MySQL 計算時間差的多種方案:從時間戳到 SQL 函數的完整指南

     編輯:PHP 綜合知識

PHP 端計算方案

1. 時間戳法(通用、高性能)

$start = mktime(0,0,0, 5,3,1998);  // 1998-05-03
$end   = mktime(0,0,0, 6,5,1999);  // 1999-06-05
$days  = round(($end - $start) / 86400); // 86400 = 24*3600
echo $days; // 398

優點:純整數運算,極快;缺點:受 32 位系統 2038 年問題限制(PHP 7.1+ 64 位無憂)。

2. DateTime 類法(現代、面向對象、無年份限制)

$start = new DateTime('1998-05-03');
$end   = new DateTime('1999-06-05');
$diff  = $start->diff($end);
echo $diff->days;        // 總天數
echo $diff->format('%y年%m月%d天'); // 1年1月2天
echo $diff->h.'小時'.$diff->i.'分'; // 時分秒

3. strtotime 解析法(靈活解析字符串)

$days = (strtotime('1999-06-05') - strtotime('1998-05-03')) / 86400;

MySQL 端計算方案

1. DATEDIFF(天數差)

SELECT DATEDIFF('1999-06-05', '1998-05-03'); -- 398

2. TIMESTAMPDIFF(多單位靈活)

SELECT TIMESTAMPDIFF(DAY, '1998-05-03', '1999-06-05');   -- 398
SELECT TIMESTAMPDIFF(MONTH, '1998-05-03', '1999-06-05');  -- 13
SELECT TIMESTAMPDIFF(SECOND, '1998-05-03 10:00', '1998-05-03 10:01'); -- 60

3. UNIX_TIMESTAMP 差值(秒數)

SELECT (UNIX_TIMESTAMP('1999-06-05') - UNIX_TIMESTAMP('1998-05-03')) / 86400;

進階:觸發器自動維護差值字段

CREATE TABLE loans (
    id INT PRIMARY KEY,
    borrow_date DATE,
    return_date DATE,
    days_diff INT
);

CREATE TRIGGER update_days_diff
BEFORE INSERT ON loans
FOR EACH ROW
SET NEW.days_diff = DATEDIFF(NEW.return_date, NEW.borrow_date);

方案選型建議

場景推薦方案理由
PHP 邏輯中臨時計算DateTime::diff()面向對象、可讀性強、無年份限制
高頻計算、性能敏感時間戳減法純整數運算最快
SQL 查詢過濾/排序TIMESTAMPDIFF()下推到存儲層,利用索引
需持久化差值字段觸發器 + DATEDIFF寫入時自動計算,讀取零成本
跨時區業務DateTime + DateTimeZonePHP 原生支援時區轉換

常見陷阱提醒

  • 閏年/閏秒:DateTime::diff 自動處理,時間戳法需注意 86400 非恆定(夏令時切換日)。
  • 日期邊界:DATEDIFF('2024-01-02', '2024-01-01') = 1,不含起始日。
  • NULL 值:SQL 函數參數為 NULL 時返回 NULL,需 IFNULL 處理。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved