我有一个包含两个 DATETIME 值的数据库,然后我从中生成一些新值:
tdiff = timediff(d1,d2)+0
day1 = truncate(tdiff/60.0/60.0/24.0,0)
day2 = datediff(d1,d2)+0
所有这三个“变量”都是(临时)数据库中的 FLOAT 字段。我预计这一点,day1
并且day2
差异永远不会超过 1 或 2。但是,有些值似乎会产生一个疯狂的答案 - 它们往往是tdiff
. 计算来自的值tdiff
表明计算是正确的。
从概念上讲,day2 应该是 DATETIME 值的日期之间的差异,day1 应该是同一时间范围内的 24 小时周期数。
最大的区别在于 timediff 的最大值:使用计算,24 小时周期的数量刚刚超过 97。但是,使用 DATEDIFF 函数显示的时间跨度低至 60 天。这是没有意义的。
当 TIMEDIFF 结果为 26 个 24 小时周期时,也存在很大差异:DATEDIFF 报告为 10 天 - 或者 TIMEDIFF 结果为 30 个 24 小时周期,而 DATEDIFF 报告为 11 天。TIMEDIFF 报告 79 天时也存在差异,但 DATEDIFF 给出 29 天。
以下是示例输出 - 来自 Ruby 脚本(并采用 Ruby 数组格式) - 包含 d1、d2、TIMEDIFF、24 小时周期、DATEDIFF 列:
["2012-04-11 06:15:21", "2012-02-09 22:11:21", "8.38596e+06", "97", "62"]
["2012-04-11 06:15:22", "2012-02-09 22:13:24", "8.38596e+06", "97", "62"]
["2012-04-11 06:15:25", "2012-02-09 22:15:29", "8.38596e+06", "97", "62"]
["2012-04-11 05:47:25", "2012-03-31 05:07:01", "2.64402e+06", "30", "11"]
["2012-04-11 05:47:26", "2012-03-31 05:09:03", "2.64382e+06", "30", "11"]
["2012-04-11 05:47:27", "2012-03-31 05:27:21", "2.64201e+06", "30", "11"]
["2012-04-11 05:48:43", "2012-01-27 16:39:32", "8.38596e+06", "97", "75"]
["2012-04-11 05:49:00", "2012-04-01 19:58:00", "2.2551e+06", "26", "10"]
["2012-04-11 05:49:00", "2012-04-01 20:00:02", "2.25486e+06", "26", "10"]
["2012-04-11 05:49:00", "2012-04-01 20:02:04", "2.25466e+06", "26", "10"]
["2012-04-11 05:49:05", "2012-04-01 20:04:04", "2.2545e+06", "26", "10"]
["2012-04-11 05:49:06", "2012-04-01 20:06:06", "2.2543e+06", "26", "10"]
["2012-04-11 05:49:06", "2012-01-27 17:36:07", "8.38596e+06", "97", "75"]
["2012-04-11 05:49:07", "2012-04-01 20:08:10", "2.25406e+06", "26", "10"]
["2012-04-11 06:15:06", "2012-03-13 12:23:24", "6.89514e+06", "79", "29"]
["2012-04-11 06:15:07", "2012-03-13 12:25:25", "6.89494e+06", "79", "29"]
为什么这些计算如此不同?我假设这是对 TIMEDIFF 缺乏了解,但我错过了什么?
答案在于充分理解
TIMEDIFF
函数以及它作为整数返回的内容。首先,让我们考虑
TIMEDIFF
一下它的原生元素以及它返回的内容:其次,在整数上下文中返回什么
TIMEDIFF
- 通过添加零来完成:现在,我们使用该
TIME_TO_SEC
函数返回我们真正想要的:返回的整数值
TIMEDIFF
不是分钟或秒,而是实际时间的以 10 为底的表示形式 - 因此 01:00:00 变为 10000,而 05:05:01 变为 50501。除了使用
TIME_TO_SEC
one 之外,还可以使用TIMESTAMPDIFF
而不是TIMEDIFF
将单位设置为所需的任何单位:除了
MINUTE
,您还可以使用FRAC_SECOND
(微秒)、SECOND
、MINUTE
、HOUR
、DAY
、WEEK
、MONTH
、QUARTER
或YEAR
。MySQL(本例中为 5.1 版)中的时间函数均在手册中进行了描述。在线手册还链接到其他版本(例如 MySQL 5.5)。