我有DB結構這樣的 -MySQL的:找到最近的最大值,如果沒有找到最近的最小值
表:任務
列: 的TaskID,TaskDescription,TaskCreatedDate
因此,如果我想找到TaskCreatedDate
與當前時間戳的距離最近,並且沒有任何任務存在的值比當前時間戳的值大,那麼找到TaskCreatedDate
有ne當前時間戳的值較小。這應該在單個查詢中完成。我怎樣才能做到這一點?
請幫忙。在此先感謝
我有DB結構這樣的 -MySQL的:找到最近的最大值,如果沒有找到最近的最小值
表:任務
列: 的TaskID,TaskDescription,TaskCreatedDate
因此,如果我想找到TaskCreatedDate
與當前時間戳的距離最近,並且沒有任何任務存在的值比當前時間戳的值大,那麼找到TaskCreatedDate
有ne當前時間戳的值較小。這應該在單個查詢中完成。我怎樣才能做到這一點?
請幫忙。在此先感謝
由於我們沒有一段代碼來很好的理解,你可以試試:
select *
from Tasks
order by cast([TaskDueDate] as datetime) asc
CAST或CONVERT轉換明確的值形成一個數據類型到另一個。
這需要一個聰明的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按未來日期排序,因此最接近的是第一個。如果沒有,那麼第三個進場,讓其餘的下降。
超喜歡! – gans
-- 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讓我們回到第二個條件時,首先爲空
搶到第一晚於現在的任務工會(如果有的話),再加上一個早於現在的任務,保持第一個結果。
(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
謝謝你。有效。我錯過了最後的LIMIT 1條件 – gans
這是怎麼回事?
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
您之前曾嘗試過什麼?它可以幫助我們。謝謝。 –
是TaskCreatedDate是日期時間字段嗎? –
你會如何安排一些東西的創建日期大於當前時間戳? – nurdglaw