Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在MySQL中存储日期和小时(不含分钟和秒)_Php_Mysql - Fatal编程技术网

Php 在MySQL中存储日期和小时(不含分钟和秒)

Php 在MySQL中存储日期和小时(不含分钟和秒),php,mysql,Php,Mysql,我需要用小时来存储日期,但不能用分钟或秒。这是因为我希望数据按小时分组,并且能够在重复密钥更新时插入。如果在同一小时内发生两个事件 我见过一些应用程序使用DATETIME字段,并插入 日期(“Y-m-d H”):00:00' 这是最佳做法还是有更好的解决方案?是的,这是一个很好的做法。日期/时间应保留在日期/时间字段中-由于您仍然可以使用特殊的日期和时间函数,这非常有用 是的,这是很好的做法。日期/时间应保留在日期/时间字段中-由于您仍然可以使用特殊的日期和时间函数,这非常有用 如果您希望按小时

我需要用小时来存储日期,但不能用分钟或秒。这是因为我希望数据按小时分组,并且能够在重复密钥更新时插入
如果在同一小时内发生两个事件

我见过一些应用程序使用
DATETIME
字段,并插入

日期(“Y-m-d H”):00:00'


这是最佳做法还是有更好的解决方案?

是的,这是一个很好的做法。日期/时间应保留在日期/时间字段中-由于您仍然可以使用特殊的日期和时间函数,这非常有用

是的,这是很好的做法。日期/时间应保留在日期/时间字段中-由于您仍然可以使用特殊的日期和时间函数,这非常有用

如果您希望按小时对事物进行分组,并且希望它能够正常运行,请创建一个派生列,该列以小时为单位存储时间值(从历元开始)。通常,这就像用秒数除以纪元时间3600一样简单

您将拥有如下模式:

event_time DATETIME,
event_hour INT
INSERT INTO ... (..., event_time, event_hour)
  VALUES (..., '2016-05-30 13:00:00', 406841)
然后添加如下值:

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

您可以在
event\u hour
列上设置
UNIQUE
约束。

如果您希望按小时对事物进行分组,并且希望它能够执行,请创建一个派生列,该列以小时为单位存储自历元以来的时间值。通常,这就像用秒数除以纪元时间3600一样简单

您将拥有如下模式:

event_time DATETIME,
event_hour INT
INSERT INTO ... (..., event_time, event_hour)
  VALUES (..., '2016-05-30 13:00:00', 406841)
然后添加如下值:

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

您可以在
event\u hour
列上设置
UNIQUE
约束。

这实际上取决于您的用例

  • 如果您需要查询特定的
    日期
    或特定的
    小时
    条目。您应该使用单独的
    DATE
    TIME
    (或
    TINYINT
    )列类型,两列上都有
    唯一索引
    ,而不是
    DATETIME
    列类型
  • 如果您只需要带有小时的日期,则可以使用带有唯一索引的
    DATETIME
我更愿意通过接受完整日期作为列来确保生成的数据是正确的。这使得查询用于报告等目的以及标准化其他列值变得更加容易

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)
然后,使用
full\u date
列作为参考,格式化查询的输入数据,而不是在PHP中格式化插入值或声明单个列值

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)
如果对
my\u hour
列使用
TINYINT
,请将插入值更改为
TIME\u格式(完整日期,'%H')

插入另一个更改分钟和秒的条目,以使重复项递增

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)
然后,您可以将
my_date
my_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']);

这实际上取决于您的用例

  • 如果您需要查询特定的
    日期
    或特定的
    小时
    条目。您应该使用单独的
    DATE
    TIME
    (或
    TINYINT
    )列类型,两列上都有
    唯一索引
    ,而不是
    DATETIME
    列类型
  • 如果您只需要带有小时的日期,则可以使用带有唯一索引的
    DATETIME
我更愿意通过接受完整日期作为列来确保生成的数据是正确的。这使得查询用于报告等目的以及标准化其他列值变得更加容易

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)
然后,使用
full\u date
列作为参考,格式化查询的输入数据,而不是在PHP中格式化插入值或声明单个列值

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)
如果对
my\u hour
列使用
TINYINT
,请将插入值更改为
TIME\u格式(完整日期,'%H')

插入另一个更改分钟和秒的条目,以使重复项递增

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)
然后,您可以将
my_date
my_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']);

据我所知,最好以整数格式存储日期,比如大纪元时间,因为 1.它将存储日期、月份、年、时、分、秒等所有内容。 2.使用历元时间搜索时,它会更快,因为整数比较比字符串比较快


据我所知,最好以整数格式存储日期,如历元时间,因为 1.它将存储日期、月份、年、时、分、秒等所有内容。 2.使用历元时间搜索时,它会更快,因为整数比较比字符串比较快


它们是广告印象,一小时内可能有数百万。它们是广告印象,一小时内可能有数百万