2016-05-29 59 views
5

我有這樣的一個表:判斷日期爲「昨天」,「上週」等

// mytable 
+----+------------+ 
| id | date_time | 
+----+------------+ 
| 1 | 1464136759 | -- 5 days ago 
| 2 | 1464436759 | -- 2 days ago 
| 3 | 1464538248 | -- 6 hours ago 
+----+------------+ 
--     ^these are based on current time which is 1464561158 

我也有這個疑問:

SELECT id, CASE DATE(FROM_UNIXTIME(date_time)) 
      WHEN CURDATE() THEN 'today' 
      WHEN CURDATE() - INTERVAL 1 DAY THEN 'yesterday' 
      WHEN CURDATE() - INTERVAL 7 DAY THEN 'in last week' 
      ELSE 'in last month or more' 
      END range 
FROM mytable 
WHERE 1 

這裏是電流輸出:

+----+---------------+ 
| id |  range  | 
+----+---------------+ 
| 1 | in last month | 
| 2 | in last month | 
| 3 | yesterday  | 
+----+---------------+ 

正如你看到我的問題,選擇所有這些unix時間錯誤。爲什麼以及如何修復它?

這裏是預期輸出:

+----+--------------+ 
| id | range  | 
+----+--------------+ 
| 1 | in last week | 
| 2 | yesterday | 
| 3 | today  | 
+----+--------------+ 
+0

您的代碼在SQL Fiddle中工作(如此):http://www.sqlfiddle.com/#!9/e63fd/3。由於第三種情況,代碼不正確,但確實會產生預期的輸出。 –

+0

時間戳只與DATE有關,直到DATE,這可能不是很有趣。將其從問題中刪除以澄清問題/範圍。 – user2864740

+0

@ user2864740我不明白你是什麼意思.. –

回答

3

想必,你想要的邏輯是這樣的:

SELECT id, 
     (CASE WHEN FROM_UNIXTIME(date_time) >= CURDATE() THEN 'today' 
      WHEN FROM_UNIXTIME(date_time) >= DATE_SUB(CURDATE(), INTERVAL 1 DAY) THEN 'yesteray' 
      WHEN FROM_UNIXTIME(date_time) >= DATE_SUB(CURDATE(), INTERVAL 7 DAY) THEN 'in last week' 
      ELSE 'in last month or more' 
     END) as `range` 
FROM mytable 
WHERE 1; 

注:

  • 沒有理由來提取日期。
  • case語句中的子句按順序執行,因此第一個匹配的語句將返回一個值。
  • 如果您的原始代碼失敗,那麼這可能也會失敗。你原來的代碼不應該只返回「昨天」。
  • range是保留字,所以需要轉義。

Here是SQL小提琴。

+0

謝謝,+1 ..!當我問一個數據庫問題時,我在等待你的答案..請始終這樣做:-) *(爲我寫一個答案)* –

+0

昨天的比賽是因爲他的日期(今天)完全匹配curdate() - 1「昨天」的案例標準。請注意,unix時間在UTC,在美國幾個小時curdate() - 1是我們的'今天'日期 – EoinS

2

的問題是你的arent檢查本週一系列關於第三個條件。含義...

DATE(FROM_UNIXTIME(date_time)) BETWEEN CURDATE() - INTERVAL 7 DAY AND CURDATE() - INTERVAL 1 DAY 

FIDDLE

目前你的代碼是說WHEN CURDATE() - INTERVAL 7 DAY THEN 'in last week'如果日期是等於7天前ONLY。 25號不是第22號,因此檢查失敗。您需要指定一個範圍才能使其工作。

+0

你的小提琴也能工作,謝謝+1。只是我的本地結果是不同的..我真的不知道爲什麼,我應該改變像MySQL時間?因爲我認爲它設置不正確。 –

+0

@Stack你可以選擇CURDATE()來查看你得到的MySQL日期。這可能是你的配置關閉了。 –

+0

戈登小提琴也不能完全工作,因爲它不檢查條件上的範圍:) –

相關問題