Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.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
为什么mysql在这个str_to_date()调用中要减去10个小时_Mysql - Fatal编程技术网

为什么mysql在这个str_to_date()调用中要减去10个小时

为什么mysql在这个str_to_date()调用中要减去10个小时,mysql,Mysql,mysql版本14.14发行版5.7.28,用于osx10.14(x86_64),使用EditLine包装器 mysql> select str_to_date('2019-11-13 09:32:51', '%Y-%m-%D %H:%i:%s'); select str_to_date('2019-11-13 09:32:51', '%Y-%m-%D %H:%i:%s'); +--------------------------------------------------------

mysql版本14.14发行版5.7.28,用于osx10.14(x86_64),使用EditLine包装器

mysql> select str_to_date('2019-11-13 09:32:51', '%Y-%m-%D %H:%i:%s');
select str_to_date('2019-11-13 09:32:51', '%Y-%m-%D %H:%i:%s');
+---------------------------------------------------------+
| str_to_date('2019-11-13 09:32:51', '%Y-%m-%D %H:%i:%s') |
+---------------------------------------------------------+
| 2019-11-13 09:32:51                                     |
+---------------------------------------------------------+
1 row in set (0.00 sec)
那里一切都好。但是

mysql> select str_to_date('2019-11-13 10:32:51', '%Y-%m-%D %H:%i:%s');
select str_to_date('2019-11-13 10:32:51', '%Y-%m-%D %H:%i:%s');
+---------------------------------------------------------+
| str_to_date('2019-11-13 10:32:51', '%Y-%m-%D %H:%i:%s') |
+---------------------------------------------------------+
| 2019-11-13 00:32:51                                     |
+---------------------------------------------------------+
1 row in set (0.00 sec)

mysql> 
当字符串中的小时数>=10时,转换的日期时间缺少10小时

使用STR_TO_DATE()将starttime字符串转换为MySQL日期时间:

STR_TO_DATE(starttime, '%m-%d-%Y %r')
然后使用TIMEDIFF()减去两次:

select ID,NCOde,   TIMEDIFF(ifnull(EndTime,now()), STR_TO_DATE(starttime, '%m-%d-%Y %r')) 
from xxx where STR_TO_DATE(starttime,'%m-%d-%Y %r')
    between '2012-05-09 00:00:00' and '2012-05-09 23:59:59'

您可能应该考虑将StistTimeStudio的数据类型更改为DATETIME或TIMESTATE。还要注意,这假设EndTime已经是这样的数据类型,否则您也必须对它执行类似的转换

如果starttime和endtime列是MySQL DATETIME数据类型,那么它们必须都是24小时格式的;对于12hr格式的数据类型,它必须是其他数据类型-可能是像VARCHAR这样的字符串类型?如果是这种情况,那么您必须提供适当的格式化字符串作为STR_to_DATE的第二个参数,以便MySQL将字符串解析为如上所示的日期时间(例如,对于24小时时间,使用%T而不是%r)

mySQL有DATE_SUB():


感谢p.Salmon的评论,正确的表述是:

select str_to_date('2019-11-13 10:32:51', '%Y-%m-%d %H:%i:%s');
+---------------------------------------------------------+
| str_to_date('2019-11-13 10:32:51', '%Y-%m-%d %H:%i:%s') |
+---------------------------------------------------------+
| 2019-11-13 10:32:51                                     |
+---------------------------------------------------------+
1 row in set (0.00 sec)

这不是问题的答案。也似乎是d的剪切和粘贴,而不是d。有关此功能的参数,请参见手册
select str_to_date('2019-11-13 10:32:51', '%Y-%m-%d %H:%i:%s');
+---------------------------------------------------------+
| str_to_date('2019-11-13 10:32:51', '%Y-%m-%d %H:%i:%s') |
+---------------------------------------------------------+
| 2019-11-13 10:32:51                                     |
+---------------------------------------------------------+
1 row in set (0.00 sec)