2014-07-06 163 views
2

我試圖在UNIX中使用UNIX時間戳切換到DATETIME列,並且在查找日期之間進行比較時遇到了一些問題。DATETIME比較?

我嘗試使用+-運算符比較兩個DATETIME s,結果對我沒有任何意義。

例如:

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()可以用來添加和日期減去的間隔,但我沒有看到手冊中對應的任何功能的偉大和小於運營商,那麼如何檢查當前日期是否大於其他日期呢?

我嘗試使用<>運營商和他們似乎工作,但我似乎無法找到該手冊中關於這個事情,並希望使確保這是確定使用這些運營商是這樣的:

SELECT UTC_TIMESTAMP() > DATE_SUB(UTC_TIMESTAMP(), INTERVAL 1 HOUR) 

誰能神祕性DATETIME比較在MySQL?

回答

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和0123上使用數字操作數數據類型。保持爲date_add()date_sub()設計的功能。

+0

謝謝,這清理了很多。所以在日期時間值上使用'+'和'-'不會產生理想的結果,但是比較大於/小於比較呢?正在使用'<' and '>'來檢查一個日期時間值是否大於/小於另一個? – Nate

+1

@Nate是的,當然你可以用'>','<='和其他操作符進行比較。如果你不能這樣做,它會使你的數據過濾變得相當複雜。 'select * from cbhview where nowtime cartbeforehorse

+0

@Nate我剛剛看到你正在嘗試做什麼。是的,你也可以在邏輯比較器中加入'select'語句,但是這不會被過濾(就像在聲明的where部分那樣)。再次,小心你知道你想要什麼。在'select'語句中,邏輯比較器給你一個'真/假'(實際上是'1/0')響應。 '從cbhview選擇nowtime cartbeforehorse

4

引述文檔中關於UTC_TIMESTAMP()

返回當前UTC日期和時間作爲一個值 'YYYY-MM-DD HH:MM:SS' 或YYYYMMDDHHMMSS格式,這取決於功能 用於字符串或數字上下文中。

由於該值正在數字的上下文中使用,因此將其視爲數字,這是您看到的行爲。