2013-07-03 53 views
2

我們在數據庫中的兩個日期之間的下一個最近的一天:MySQL的 - 獲取2天

  1. 2013年8月1日
  2. 2013年8月3日

讓我們說,今天的日期是2013-08-02,我們想要從數據庫中獲得下一個最近的日期。我發現這個查詢,但它沒有得到第二天但以往的:

SELECT 
    * 
FROM 
    your_table 
ORDER BY 
    ABS(DATEDIFF(NOW(), `date`)) 
LIMIT 1 

當我們運行它,我們得到2013年8月1日,而不是2013年8月3日,因爲我們想要的。解決方案是什麼?

+0

你總是希望得到的日期,將來還是要之前或之後拿到最接近的日期當前日期? – dethtron5000

+0

這兩個日期是等距的。你如何確定2013-08-03比2013-08-01更受歡迎? – eggyal

回答

2

其他人已經發布的答案,如果你總是希望將來的日期:

select * 
from your_table 
where date > now() 
order by date 
limit 1 

如果沒有將來的日期,但您仍想返回的最後日期,那麼你可以通過修改order by做到這一點條款:

select * 
from your_table 
order by (date > now()) desc, 
     (case when date > now() then date end) , 
     date desc 
limit 1; 

EDIT(在響應評論):

要處理 「今天」 爲最接近的日期,你需要轉換now()的日期和使用>=

select * 
from your_table 
order by (`date` >= date(now())) desc, 
     (case when `date` >= date(now()) then `date` end) , 
     `date` desc 
limit 1; 

order by條款有三個組成部分。第一個是任何未來日期的標誌。這將首先考慮未來的日期。後兩個條款按日期排序。第一個按照升序排列未來的日期。過去的日期都具有相同的值('NULL'),所以這些受第三個條款的影響,這些條款按降序排列。

+0

第二個查詢幾乎是好的,但如果也有日期指着今天? – user1257255

+0

非常感謝!你能不能僅僅給「order by」添加一些註釋,因爲這是我第一次看到更多「order by」子查詢的查詢,特別是對於我來說是個新東西的情況。 – user1257255

2
SELECT * 
FROM  your_table 
WHERE date >= CURRENT_DATE 
ORDER BY date 
LIMIT 1 
+0

我認爲如果沒有更近的過去日期,OP只想要未來的日期。 –

0
SELECT * FROM table WHERE date > NOW() ORDER BY date ASC LIMIT 1; 

您將獲得下一個最接近的日期

+0

但是如果目前沒有任何日期,只有過去會發生什麼? – user1257255

0
SELECT * FROM your_table 
ORDER BY 
    MIN(DATEDIFF(NOW(), `date`)) ASC 
LIMIT 1 

會給你未來的日期較高的一個,因爲它會-1,然後1,2,...,所以通過ASC排序並且沒有ABS,但是不確定它會對你的所有情況都有好處。

+0

與這一個我只得到最新的日期,但沒有下一個當前 – user1257255

+0

嘗試與'MIN(DATEDIFF(NOW(),日期)ASC)' – mirkobrankovic

0

它必須有一個條件where在日期只給下一個日期,而不是以前的

+0

請提供一個例子。謝謝! – user1257255

+0

假設我們有以下值:
2013年1月1日
2013年3月1日
2013年5月1日
和NOW()函數返回2013年2月1日
與where條件是返回03-01-20
ktaria