我试图了解如何比较 DATETIME 值(表面上插入为 GMT)和 TIMESTAMP 值(在 INSERT 时间自动生成)。
据我了解, DATETIME 设置为它设置的任何值 - 无论服务器或客户端上的时区是什么,报告都会返回相同的值。
在 MySQL 文档中,听起来 TIMESTAMP 值是在当前时区报告的,但存储在 UTC 中。
在这种情况下,应该可以从 TIMESTAMP 值中减去 DATETIME 值(较早的事件),而无需进行大量时区转换 - 因为 DATETIME 是 GMT 而 TIMESTAMP 值是 UTC。然而,准确地做到这一点 - 并理解它 - 被证明是一个问题。
我有需要(DATETIME - TIMESTAMP)
在几分钟和几天内完成的情况。如果我们假设该列d
是 DATETIME 并且列t
是 TIMESTAMP ......到目前为止,我已经尝试过:
DATEDIFF(d,t)
TIMEDIFF(d,t)
UNIX_TIMESTAMP(d) - UNIX_TIMESTAMP(t) - 1800
(占夏令时)
我们这里的时区是美国中部时间 - 当前是中部夏令时间 - CST 的 GMT-6 和当前 CDT 的 GMT-5。
看起来 DATEDIFF 将两个值都转换为日期然后比较它们 - 而不是比较值之间的时间并除以每个值的 24 小时数。因此,无论如何,我认为 DATEDIFF 不会直接为我工作。
那么具体的问题是:
- 您如何将 GMT 中的 DATETIME 与 TIMESTAMP 值进行比较?具体来说,假设 TIMESTAMP 值是最后生成的,则查找两者之间的分钟数。
- 获得相同两个值之间 24 小时时段差异的最佳方法是什么?我认为它会是 - 使用 A1 作为上述问题的答案 -
TRUNCATE(A1 / (24.0 * 60.0))
...
更新:尝试使用具有和CONVERT_TZ
值的函数。但是,具有此类规范的函数似乎从当前系统时间读取夏令时设置,而不是从数据库字段读取的时间。这意味着当数据应作为 CST 中的日期时,它被读取为 CDT。US/Central
GMT
CONVERT_TZ
我一直认为获得一个字段的 UTC 表示必须很简单TIMESTAMP
——在我看来,这会简化事情。
更新 2:在我看来,我对CONVERT_TZ
. 我正在使用这个功能,它似乎工作:
TIMEDIFF(CONVERT_TZ(t),'US/Central','UTC'),d)
即使在时区更改(从 CST 到 CDT)时,它似乎也可以工作......
有一个关于时间和日期功能的手册页。
比较日期和时间并返回分钟的最佳方法可能是使用以下方法之一:
请注意,虽然
TIMEDIFF
与时间一起使用,但TIMESTAMPDIFF
需要一个日期组件 - 并且值在TIMESTAMPDIFF
.您可以使用以下任一方式返回小时数:
请注意,使用 时
DATEDIFF
,返回的值是给定时间的日期组件之间的差异 - 因此,一天的值 23:59 与下一天的值 0:01(2 分钟差异)导致日期差 1(一整天)。要获得 24 小时周期(一天的长度)中两次之间的差异,首先计算以分钟为单位的差异,然后除以适当的值以找到 24 小时周期的数量。尝试这个:
这会截断小数部分,仅返回指定时间跨度内完整的 24 小时周期数。