2016-05-30 192 views
-1

我需要存儲具有小時但沒有分鐘或秒的日期。這是因爲我希望數據按小時分組,並且如果在同一小時內發生兩個事件,可以插入ON DUPLICATE KEY UPDATE...在MySQL中存儲日期和時間(不含分鐘和秒)

我見過使用DATETIME領域的一些應用,並與

date("Y-m-d H") . ':00:00'

插入這是最好的做法還是有更好的解決方案?

+0

他們是廣告的曝光,他們可能是數以百萬計在單一小時 –

回答

1

是的,這是很好的做法。日期/時間應該保留在日期/時間字段 - 這要歸功於您仍然可以使用特別的日期和時間功能,這是非常有用的。

+0

對不起...更新....感謝;) – nospor

0

如果您希望按小時對事物進行分組,並且希望高性能,請創建一個派生列,該列可存儲自時代以來小時數的時間值。通常,這是由3600

除以秒時代時容易你有一個這樣的模式:

event_time DATETIME, 
event_hour INT 

然後添加值是這樣的:

INSERT INTO ... (..., event_time, event_hour) 
    VALUES (..., '2016-05-30 13:00:00', 406841) 

可以設置event_hour列上的UNIQUE約束。

1

這真的取決於你的用例。

  • 如果您需要查詢特定date或特定hour條目。您應該使用單獨的DATETIME(或TINYINT)列類型,在兩列上均使用UNIQUE INDEX,而不是DATETIME列類型。
  • 如果您只需要使用小時的日期,DATETIME列與UNIQUE INDEX將是適合的。

我傾向於通過接受完整日期作爲列來確保結果數據是正確的。這樣可以更輕鬆地查詢報告目的等,以及標準化其他列值。

mysql> CREATE TABLE `test` (
    -> `my_date` DATE NULL DEFAULT NULL, 
    -> `my_hour` TIME NULL DEFAULT NULL, 
    -> `full_date` DATETIME NULL DEFAULT NULL, 
    -> `duplicates` INT(11) NULL DEFAULT '0', 
    -> UNIQUE INDEX `my_date_my_hour` (`my_date`, `my_hour`) 
    ->); 
Query OK, 0 rows affected (0.18 sec) 

然後,而不是格式化PHP插入值或聲明各個列值,格式化查詢的輸入數據,使用full_date柱作爲參考。

mysql> INSERT INTO test (full_date, my_date, my_hour) 
    -> VALUES('2016-04-01 20:30:22', DATE(full_date), TIME_FORMAT(full_date, '%H:00:00')) 
    -> ON DUPLICATE KEY UPDATE 
    -> duplicates = duplicates+1; 
Query OK, 1 row affected (0.04 sec) 

如果使用TINYINTmy_hour列,插入值更改爲TIME_FORMAT(full_date, '%H')。要遞增

mysql> SELECT * FROM test; 
+------------+----------+---------------------+------------+ 
| my_date | my_hour | full_date   | duplicates | 
+------------+----------+---------------------+------------+ 
| 2016-04-01 | 20:00:00 | 2016-04-01 20:30:22 |   0 | 
+------------+----------+---------------------+------------+ 
1 row in set (0.00 sec) 

插入另一條目改變分,秒,以引起副本。

mysql> INSERT INTO test (full_date, my_date, my_hour) 
    -> VALUES('2016-04-01 20:32:20', DATE(full_date), TIME_FORMAT(full_date, '%H:00:00')) 
    -> ON DUPLICATE KEY UPDATE 
    -> duplicates = duplicates+1; 
Query OK, 2 rows affected (0.04 sec) 
mysql> SELECT * FROM test; 
+------------+----------+---------------------+------------+ 
| my_date | my_hour | full_date   | duplicates | 
+------------+----------+---------------------+------------+ 
| 2016-04-01 | 20:00:00 | 2016-04-01 20:30:22 |   1 | 
+------------+----------+---------------------+------------+ 
1 row in set (0.00 sec) 

然後你就可以連接了my_datemy_hour列到一個單獨列的值在PHP接受。

mysql> SELECT *, CONCAT(my_date, 'T', my_hour) as date_hour FROM test; 
+------------+----------+---------------------+------------+---------------------+ 
| my_date | my_hour | full_date   | duplicates | date_hour   | 
+------------+----------+---------------------+------------+---------------------+ 
| 2016-04-01 | 20:00:00 | 2016-04-01 20:30:22 |   1 | 2016-04-01T20:00:00 | 
+------------+----------+---------------------+------------+---------------------+ 
1 row in set (0.00 sec) 

然後在PHP中,你可以格式化結果的記錄。

$date = new DateTime($row['date_hour']); 
$timestamp = strtotime($row['date_hour']); 
//or 
$date = new DateTime($row['my_date'] . 'T' . $row['my_hour']); 
$timestamp = strtotime($row['my_date'] . 'T' . $row['my_hour']); 
0

從我最好的知道它會更好地存儲日期像劃時代的時間,因爲 1.它將存儲像月日小時分秒每一件事情整數格式。 2.使用紀元時間進行搜索時,它會更快,因爲整數比較比字符串比較更快。

Use of epochtime in MySQL

相關問題