2012-12-28 6 views
3

J'essaie d'exécuter une requête qui retournera les lignes triées par ordre décroissant de la date du jour.Trouver la ville plus proche

Voici quelques données:

 
| date | 
|----------| 
|2012-12-02| 
|2012-12-04| 
|2012-12-10| 
|2012-12-15| 
|2012-12-29| 
|2013-01-02| 
|2013-01-04| 

Voici ma question:

SELECT * FROM days 
    ORDER BY ABS(strftime("%s", date) - strftime("%s", 2012-12-28)) ASC 

Il retourne uniquement les lignes dans le même ordre que je posté ci-dessus, je veux obtenir un résultat comme

 
| date | 
|----------| 
|2012-12-29| 
|2013-01-02| 
|2013-01-04| 
|2012-12-15| 
|2012-12-10| 
|2012-12-04| 

Mon champ de date est une chaîne au format yyyy-MM-dd (il y a une raison pour laquelle je ne le stocke pas en tant que horodatage). Qu'est-ce que je fais mal?

+3

Il y a toujours une raison * pour ne pas stocker comme un horodatage, mais il est généralement mal :) – Gerrat

+0

Ma raison est la suivante, le dispositif de cette base de données est traverserons timezones souvent, mais je veux la date de ne soit pas affecté par cela. Si le 2012-12-29 est stocké dans le fuseau horaire de PST et qu'il est ensuite envoyé au Japon, je veux quand même qu'il sorte le 2012-12-29, pas le 2012-12-30 comme il le serait avec un horodatage. Je ne peux pas stocker d'informations de fuseau horaire dans la base de données, car il ne sera pas disponible. – Ralgha

+0

Pouvez-vous essayer de vérifier si les deux dates de comparaison sont dans le même format? Sachez que c'est idiot mais essayez quand même. – GautamJeyaraman

Répondre

3

Il semble y avoir une erreur sur le code:

SELECT * FROM days 
    ORDER BY ABS(strftime("%s", date) - strftime("%s", 2012-12-28)) ASC 

écrit de cette façon, la requête affichera les résultats juste triés par date.

La raison: 2012-12-28 sera traitée comme une opération arithmétique entre entiers. Vous devez écrire '2012-12-28', pour indiquer qu'il s'agit d'un date.

+0

Bien sûr! Cela fonctionne maintenant, merci. – Ralgha

1

Vous n'avez pas besoin d'utiliser strftime.

SELECT * FROM days 
WHERE date <= '2012-12-28' 
    ORDER BY date ASC 
    -- LIMIT 5 
+0

Petit indice: cela ne retourne pas la date la plus proche mais les dates qui sont avant celle donnée. – sibbl

Questions connexes