C'est une base de données permettant aux annonceurs de contacter leurs clients qui doit être triée par critères:
Si la date n'est pas spécifiée, il s'agit d'un contact non pertinent et doit être répertorié en bas.
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:
- Les entrées sans données (0000-00-00 00:00:00) doivent être répertoriées à la fin du tableau.
- 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)
3 réponses
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 */
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
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;
De nouvelles questions
mysql
MySQL est un système de gestion de base de données relationnelle (RDBMS) gratuit et open source qui utilise SQL (Structured Query Language). N'UTILISEZ PAS cette balise pour d'autres bases de données telles que SQL Server, SQLite, etc. Ce sont des bases de données différentes qui utilisent toutes leurs propres dialectes SQL pour gérer les données.