C'est une base de données permettant aux annonceurs de contacter leurs clients qui doit être triée par critères:

  1. Si la date n'est pas spécifiée, il s'agit d'un contact non pertinent et doit être répertorié en bas.

  2. Si la date est spécifiée mais que l'heure ne l'est pas, elle doit figurer en bas de cette date.

Le champ "contact_request" est DATETIME

Ainsi, objectif:

  1. Les entrées sans données (0000-00-00 00:00:00) doivent être répertoriées à la fin du tableau.
  2. Les entrées intemporelles (% 00: 00: 00) doivent être répertoriées à la fin de la date.

Le résultat souhaité est le suivant (00:00:00 à la fin, sinon trié ASC):

2017-01-21 09:00:00 | 1
2017-03-21 00:00:00 | 2
2017-03-22 11:00:00 | 3
2017-01-18 10:00:00 | 4
2017-03-21 10:00:00 | 5
0000-00-00 00:00:00 | 6
0000-00-00 00:00:00 | 7

Cela fait la mauvaise séquence (4,1,5,3,2, .. au lieu de 4,1,5,2,3 correctes, ..):

ORDER BY 
  CASE 
    WHEN contact_request = '0000-00-00' THEN 3 
    WHEN contact_request NOT LIKE '%00:00:00' THEN 1 
    ELSE 2 
  END, 
  contact_request ASC

Vous ne savez pas comment faire?

SQLFiddle: http://sqlfiddle.com/#!9/5c6c3/6 ( sans '0000-00-00 00:00:00' qui jette une erreur là-bas, mais c'est facile quand même)

-2
Konservin 21 avril 2017 à 15:34

3 réponses

Meilleure réponse

Vous obtenez ce résultat parce que vous donnez à tous les horodatages avec une heure non qualifiée la même valeur, les regroupant ainsi tous à la fin, avant les dates non qualifiées.

Votre déclaration case doit être un peu plus complexe pour atteindre ce que vous désirez:

ORDER BY 
  CASE 
    WHEN contact_request = '0000-00-00' THEN 1
    ELSE 2 
  END, /* not qualified dates at the end */
  DATE_FORMAT(contact_request , '%Y%m%e'), /* then order by day */
  CASE 
    WHEN contact_request LIKE '%00:00:00' THEN 2
    ELSE 1
  END, /* not qualified times at the end of each day */
  contact_request /* finally order by whole timestamp */
2
Stefano Zanini 21 avril 2017 à 13:39
ORDER BY 
CASE when replace(CONTACT_REQUEST,'00:00:00','24:00:00) = '0000-00-00 24:00:00' 
     then 2 else 1 end 

En supposant un type de données chaîne pour contact_Request.

Cela fonctionne parce que la date est stockée sous forme de chaîne et que 24 n'est pas une heure valide, mais que 00 est transformé en 24 pour une heure le mettrait en dernier chaque jour

0
xQbert 21 avril 2017 à 12:59

Vous pouvez utiliser une requête comme celle-ci:

SELECT *
FROM yourTable
ORDER BY
IF(contact_request = '0000-00-00 00:00:00'
    ,'9999-12-31 23:59:59'
    ,IF(TIME(contact_request) = '00::00:00'
            , ADDTIME('2017-01-01 00:00:00','23:59:59')
            , contact_request  ) ASC;
0
Bernd Buffen 21 avril 2017 à 13:17