2013-05-30 71 views
0

我有DB結構這樣的 -MySQL的:找到最近的最大值,如果沒有找到最近的最小值

表:任務

列: 的TaskID,TaskDescription,TaskCreatedDate

因此,如果我想找到TaskCreatedDate與當前時間戳的距離最近,並且沒有任何任務存在的值比當前時間戳的值大,那麼找到TaskCreatedDate有ne當前時間戳的值較小。這應該在單個查詢中完成。我怎樣才能做到這一點?

請幫忙。在此先感謝

+0

您之前曾嘗試過什麼?它可以幫助我們。謝謝。 –

+0

是TaskCreatedDate是日期時間字段嗎? –

+1

你會如何安排一些東西的創建日期大於當前時間戳? – nurdglaw

回答

1

由於我們沒有一段代碼來很好的理解,你可以試試:

select  * 
from  Tasks 
order by cast([TaskDueDate] as datetime) asc 

CASTCONVERT轉換明確的值形成一個數據類型到另一個。

0

這需要一個聰明的order by條款:

select * 
from tasks 
order by TaskCreatedDate > now() desc, 
     (case when TaskCreatedDate > now() then TaskCreatedDate end) asc, 
     (case when TaskCreatedDate < now() then TaskCreatedDate end) desc 
limit 1; 

根據您的類型是如何定義的,你可能想使用CURRENT_TIMESTAMP而不是now()

訂單中的第一個條款通過先訂訂未來日期,然後訂購過去日期。第二個按升序將TaskCreatedDate按未來日期排序,因此最接近的是第一個。如果沒有,那麼第三個進場,讓其餘的下降。

+0

超喜歡! – gans

1
-- IN ONE GO 
select t.*, coalesce((select TaskCreatedDate from Tasks where TaskCreatedDate > t.TaskCreatedDate ORDER BY TaskCreatedDate ASC LIMIT 1), 
         (select TaskCreatedDate from Tasks where TaskCreatedDate < t.TaskCreatedDate ORDER BY TaskCreatedDate DESC LIMIT 1) 
      ) 
    from Tasks as t 

COALESCE讓我們回到第二個條件時,首先爲空

0

搶到第一晚於現在的任務工會(如果有的話),再加上一個早於現在的任務,保持第一個結果。

(select TaskId, TaskDescription, TaskDueDate from Tasks 
     where TaskDueDate >= now() 
     order by TaskDueDate 
     limit 1) 
union 
(select TaskId, TaskDescription, TaskDueDate from Tasks 
     where TaskDueDate < now() 
     order by TaskDueDate desc 
     limit 1) 
limit 1 
+0

謝謝你。有效。我錯過了最後的LIMIT 1條件 – gans

0

這是怎麼回事?

SELECT * 
FROM Tasks 
ORDER BY (CASE WHEN TIMEDIFF(TaskDueDate, CURRENT_TIMESTAMP()) > 0 THEN 0 ELSE 1 END), 
    (CASE WHEN TIMEDIFF(TaskDueeDate, CURRENT_TIMESTAMP()) > 0 
     THEN TIMEDIFF (TaskDueeDate, CURRENT_TIMESTAMP()) 
     ELSE TIMEDIFF (CURRENT_TIMESTAMP(), TaskDueDate) 
    END) 

這會給你未來所有的任務到期日,通過增加日期排序,其次是與過去的到期日通過減少日期ordred。如果您只想要一項任務,請在末尾添加LIMIT 1