我想计算视图中两个时间字段之间的差异(mysql)。我正在使用此查询:
$result = mysql_query("CREATE OR REPLACE VIEW arbtim AS SELECT week, name, start, stop, arton,
( arton ) - ( start ) AS t18 FROM arbtid;");
“arton”字段始终为“18:00:00”。如果start =“10:00:00”,则返回“80000”。 如果start =“09:45:00”则返回“85500”。 我希望它是“8”和8,25
这两个字段都是时间格式。创建的字段t18是双重格式 - 为什么?
答案 0 :(得分:0)
阅读文档(http://dev.mysql.com/doc/refman/5.7/en/date-and-time-type-conversion.html),遗憾的是85500是记录在案的行为。我知道你在想什么......太糟糕了:(
问题是TIME转换为10000 *小时+ 100 *分钟+秒。
由于您需要数小时,我建议您明确地执行此操作:
(3600*HOUR(arton)+60*MINUTE(arton)+SECOND(arton)
-3600*HOUR(start)-60*MINUTE(start)-SECOND(start))/3600 AS t18
(感谢GolezTrol),带有TIME_TO_SEC功能,可以更简单地写成:
(TIME_TO_SEC(arton)-TIME_TO_SEC(start))/3600 AS t18
但是我想更深入地回答这个问题,因为这个奇怪的时间代数困扰了我很多。我从来没有在任何其他RDBMS或语言中看到过这样的东西。请注意,我没有看到所有这些,但有很多。
困扰我的是,这个TIME代数是一个陷阱,特别是对于没有经验的人来说。
有太多事情可能会出错。以下是部分列表:
......以及我想到的其他许多其他内容。
你知道我在哪里吗?不要在时间栏上操作......不是在MySQL为我们提供的这个扭曲和不完整的空间中。在这个空间中,大多数操作都不会像我们期望的那样工作。
这里唯一合理的解决方案是离开...将这些时间转换为我们可以按照我们的预期求和,减法,除法和乘法的其他时间。 TIME_TO_SEC是一个很好的简单选择,但还有其他选择。并且在之前将时间值转换为。
答案 1 :(得分:0)
有几种正确的方法:
使用时间戳 - 在这种情况下,结果将以秒为单位:
SELECT week, name, start, stop, arton, UNIX_TIMESTAMP( arton ) - UNIX_TIMESTAMP( start ) AS t18 FROM arbtid;
然后,要花几个小时,将秒数除以3,600。
或使用TIMEDIFF
- 在这种情况下,结果将是" -00:00:00.000001"的时间值:
SELECT week, name, start, stop, arton, TIMEDIFF( arton, start ) AS t18 FROM arbtid;
我认为前者可能更适合您的应用。
答案 2 :(得分:0)
您可以使用TIME_TO_SEC
获取时间跨度中的秒数。
然后,您可以使用它来计算小时数,只需将其除以3600。
SELECT TIME_TO_SEC(arton - start) / 3600 AS HoursBetween FROM arbtid