2016-05-30 194 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

相关问题