我正在 PHP (Laravel) 和 mySQL DB 中研究溫度計。溫度計功能具有計時器,因此您可以將時間設定為您想要的溫度。
我的初始設定是表計時器

我輸入的資料是

在嘗試從當前時間的計時器中檢索值時,我意識到不能將時間(資料型別)視為日期,因為如果我們查看第一行,from_time 23:30:00 實際上大于 to_time 06:00: 00 但我們將其視為第二天。
我正在測驗這個使用
//$time = date("H:i");
$time = date("H:i",strtotime(' 14 hour'));
$timers = Timers::whereTime('from_time', '<=', $time)->whereTime('to_time', '>=', $time)->first();
print ($time);
print ('</br>');
if($timers){
print ('Value '.$timers->value);
}
所以我的問題是......存盤和檢索這種計時器資料的最佳方法是什么?
我的想法是有一個額外的表來拆分計時器,所以對于第一行示例,我有兩個條目..
| ID | 從時間 | 時間 | 價值 |
|---|---|---|---|
| 1 | 23:30:00 | 23:59:59 | 19.50 |
| 2 | 00:00:00 | 06:00:00 | 19.50 |
| 3 | 06:00:00 | 23:30:00 | 21.50 |
第二排只有一個條目,因為它不會超過午夜 00:00:00
這樣我就可以使用提到的 php (Laravel) 檢索資料示例。這是正確的方法還是有更好的方法?
uj5u.com熱心網友回復:
- 保留您現有的桌子設計...
- ...但是將您的語意/含義更改為
to_time“之后的時間長度from_time”,而不是計時器應該停止的絕對時間。- 就個人而言,我會將其重命名為
length(或者timer_length如果您想避免與現有的 SQL 關鍵字發生沖突),
- 就個人而言,我會將其重命名為
- 請注意,在 MySQL 中,該
time型別不表示時間值:即它的范圍不受限制00:00:00-23:59:59,它的范圍實際上大約-839h到838h小時,這意味著您需要一個CHECK約束來確保值始終為非負而且也不會過長。 - 您還可以添加一個計算列來顯示實際的一天中的結束時間:
CREATE TABLE timers (
id bigint(20) PRIMARY KEY AUTO_INCREMENT,
homes_id bigint(20),
value decimal(16,2),
from_time time,
timer_length time,
days char(100),
created_at timestamp,
updated_at timestamp,
timer_end time AS ( ADDTIME( from_time, timer_length ) ),
CONSTRAINT pk_timers PRIMARY KEY ( id ),
CONSTRAINT fk_homes FOREIGN KEY ( homes_id ) REFERENCES homes ( homes_id ),
CONSTRAINT ck_timer_length CHECK ( timer_length > 0 AND timer_length < '24:00:00' )
)
uj5u.com熱心網友回復:
你可以這樣做:
$totalDuration = $finishTime->diffInSeconds($startTime);
// 例如 $totalDuration = 10
然后您可以使用 gmdate:
gmdate('H:i:s', $totalDuration);
// 00:00:10
此外,在 DateTime 中使用它會讓您知道日期和時間,因為您可以在 Laravel 中使用 Carbon 將其轉換為您想要的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/399442.html
上一篇:將陣列添加到值
