DATETIME比较?

时间:2014-07-06 19:32:47

标签: mysql sql datetime date-arithmetic

我试图在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比较神秘面纱吗?

2 个答案:

答案 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表示两者之间没有区别

简而言之,除非您确切知道自己正在做什么以及您正在尝试实现的目标,否则不要在datetimestamp数据类型上使用数字操作数。保留为此目的而设计的功能date_add()date_sub()