2013-05-30 7 views
0

J'ai la structure db comme celui-ci -Mysql: trouver le plus proche valeur maximale, si pas trouver la valeur minimale la plus proche

Tableau: Tâches

Colonnes: TaskID, TaskDescription, TaskCreatedDate

Donc, si je veux trouver TaskCreatedDate ayant la plus grande valeur la plus proche de l'horodatage actuel, et s'il n'y a aucune tâche présente ayant une valeur plus grande que l'horodatage actuel, alors TaskCreatedDate ayant La plus petite valeur à l'horodatage actuel. Cela devrait être fait en une seule requête. Comment puis-je faire ceci?

Aidez-nous s'il vous plaît. Merci à l'avance

+0

Qu'avez-vous essayé auparavant? Cela peut nous aider. Merci. –

+0

TaskCreatedDate est un champ de date et d'heure? –

+1

Comment arrangeriez-vous quelque chose pour avoir une date créée plus grande que l'horodatage actuel? – nurdglaw

Répondre

1

Comme nous ne disposons pas d'un morceau de code pour bien comprendre, vous pouvez essayer:

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

CAST ou CONVERT convertir explicitement une forme de valeur d'un type de données à un autre.

0

Cela exige une clause order by intelligente:

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; 

Selon la façon dont sont définis vos types, vous pouvez utiliser CURRENT_TIMESTAMP au lieu de now().

La première clause de la commande par commandes futures date d'abord, puis les dates antérieures. Le second met les dates futures en ordre par TaskCreatedDate dans l'ordre croissant, de sorte que le plus proche est le premier. S'il n'y en a pas, alors le troisième entre en jeu, ordonnant que le reste descende.

+0

Super aimé !!!! – 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 

soudent nous permettent de retourner deuxième condition lors de la première est nulle

0

Faire une union de la première tâche plus tardif que maintenant (le cas échéant), ainsi que la dernière tâche plus tôt que maintenant, et garde le premier résultat.

(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

Merci l'homme. Ça a marché. J'ai manqué la dernière condition LIMIT 1 – gans

0

Que pensez-vous de cela?

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) 

qui vous donnera toutes les tâches avec les futures échéances, triés par date croissante, suivie par ceux qui ont des dates d'échéance dans le passé ordred par date décroissante. Si vous ne voulez qu'une seule tâche, ajoutez LIMIT 1 à la fin