我试图在MySQL中使用UNIX时间戳切换到DATETIME
列,并且在查找日期之间进行比较的正确方法时遇到了一些麻烦。
我尝试使用+
和-
运算符来比较两个DATETIME
,结果对我没有任何意义。
例如:
1
SELECT UTC_TIMESTAMP(), UTC_TIMESTAMP() - INTERVAL 1 HOUR
输出
2014-07-06 19:19:13 | 2014-07-06 18:19:13
这些
SELECT UTC_TIMESTAMP() - DATE_SUB(UTC_TIMESTAMP(), INTERVAL 1 HOUR)
SELECT UTC_TIMESTAMP() - (UTC_TIMESTAMP() - INTERVAL 1 HOUR)
输出10000
。这个数字对我来说没有意义,但随后它变得更加混乱:
SELECT UTC_TIMESTAMP()-DATE_SUB(UTC_TIMESTAMP(), INTERVAL 1 SECOND)
输出1
。这是为什么?这个数字代表什么?
2
The manual page for date and time functions显示DATE_ADD()
和DATE_SUB()
可用于添加和减去日期中的间隔,但我没有看到手册中与大于的对应的任何功能并且少于运营商,那么我如何检查当前日期是否大于其他日期?
我尝试使用<
和>
运算符,它们似乎有效,但我似乎无法在手册中找到任何内容,并希望确定< / em>可以使用这样的运算符:
SELECT UTC_TIMESTAMP() > DATE_SUB(UTC_TIMESTAMP(), INTERVAL 1 HOUR)
任何人都可以在MySQL中揭开DATETIME
比较神秘面纱吗?
答案 0 :(得分:4)
引用有关UTC_TIMESTAMP()
的文档:
以“YYYY-MM-DD”中的值返回当前的UTC日期和时间 HH:MM:SS'或YYYYMMDDHHMMSS格式,具体取决于功能 用于字符串或数字上下文。
因为该值正在数字的上下文中使用,所以它被视为一个数字,这是您看到的行为。
答案 1 :(得分:1)
我自己刚刚发现了这个问题,但这里有一个简单的例子,向您展示它是如何运作的。
@ GordonLinoff的回答既不在这里,也不在那里,因为你的问题并不是utc_timestamp()
返回的格式。你真正问的是当你在时间戳上使用数字操作数+
和-
时,MySQL会返回什么格式。
我倾向于同意你的观点,文档在这个主题上有点模糊。但这就是我发现的。您可以自己构建此视图,以更简单的方式查看示例。
create view cbhview as
select utc_timestamp() as nowtime,
utc_timestamp() - interval 1 hour as thentime,
date_sub(utc_timestamp(),INTERVAL 1 HOUR) as thentime2,
date_sub(utc_timestamp(),INTERVAL 1 SECOND) as justthentime;
select nowtime, thentime, thentime2, justthentime,
nowtime-thentime,
nowtime-justthentime,
thentime-thentime2
from cbhview;
+---------------------+---------------------+---------------------+---------------------+------------------+----------------------+--------------------+
| nowtime | thentime | thentime2 | justthentime | nowtime-thentime | nowtime-justthentime | thentime-thentime2 |
+---------------------+---------------------+---------------------+---------------------+------------------+----------------------+--------------------+
| 2014-07-06 20:22:58 | 2014-07-06 19:22:58 | 2014-07-06 19:22:58 | 2014-07-06 20:22:57 | 10000 | 1 | 0 |
+---------------------+---------------------+---------------------+---------------------+------------------+----------------------+--------------------+
1 row in set (0.00 sec)
100000
代表1h 00min 00second
1
代表1second
0
表示两者之间没有区别简而言之,除非您确切知道自己正在做什么以及您正在尝试实现的目标,否则不要在date
和timestamp
数据类型上使用数字操作数。保留为此目的而设计的功能date_add()
和date_sub()
。