2009-10-09 8 views
32

Pouvez-vous s'il vous plaît aidez-moi à résoudre ce problème. J'essaie de classer les résultats d'une requête SQL par date, mais je n'obtiens pas les résultats dont j'ai besoin.SQL ORDER BY problème de date

La requête J'utilise est:

SELECT date FROM tbemp ORDER BY date ASC 

Les résultats sont:

01/02/2009 
03/01/2009 
04/06/2009 
05/03/2009 
06/12/2008 
07/02/2009 

Les résultats devraient être:

06/12/2008 
03/01/2009 
01/02/2009 
07/02/2009 

J'ai besoin pour sélectionner la date dans le format ci-dessus .

Votre aide est grandement appréciée.

+5

Il est important lorsque vous posez des questions à Fournissez des informations spécifiques, comme la base de données que vous utilisez et le type de données de la colonne DATE de votre table. Cela facilite les choses pour les personnes qui essaient de vous aider; ils n'ont pas à deviner. –

+5

Bien que je sais ce n'est pas vraiment essentiel à votre réponse, je serais ravi d'entendre une bonne raison pour laquelle cette colonne n'est pas un datetime ... – Achilles

+2

ORDER BY id (la valeur d'incrémentation automatique) – tetris

Répondre

14

Il me semble que votre colonne n'est pas une colonne de date mais une colonne de texte (varchar/nvarchar etc). Vous devez le stocker dans la base de données sous forme de date, pas de chaîne.

Si vous avez pour le stocker en tant que chaîne pour une raison quelconque, stockez-le dans un format triable par ex. aaaa/MM/jj.

Comme najmeddine montre, vous pourrait convertir la colonne sur chaque accès, mais j'essaierais très fort de ne pas le faire. Il fera en sorte que la base de données fasse plus de travail - il ne sera pas capable de conserver les index appropriés, etc. Dans la mesure du possible, stockez les données dans un type approprié aux données elles-mêmes.

+0

ou aaaa-mm-jj encore mieux – dusoft

+2

@dusoft: Peu importe le séparateur que vous utilisez, à condition qu'il soit dans le bon ordre de signification. –

+0

@Jon: Il est plus facile de comparer deux traits d'union que deux traits, car vous n'avez pas à gérer l'angle. : -D – Zed

37

Il semble que votre colonne de date ne soit pas de type datetime mais varchar. Vous devez le convertir en datetime lors du tri:

select date 
from tbemp 
order by convert(datetime, date, 103) ASC 

style 103 = dd/MM/yyyy (msdn)

+2

Cela ne triera pas correctement si les paramètres de langue et de format de date actuels interprètent aa/bb/cccc comme mois/jour/année, comme c'est le cas pour la plupart des installations américaines de SQL Server. (Je suppose de l'utilisation de CONVERT qu'il s'agit de T-SQL, donc vous pouvez spécifier le style 103 comme le troisième paramètre optionnel de CONVERT et remplacer n'importe quel langage ou format de dateformat.) –

+0

merci pour l'info. – manji

+0

J'aimerais savoir comment quelqu'un pourrait comprendre que ces dates n'étaient pas de 'datetime', mais' varchar' de l'information fournie. Pourquoi devrait-il y avoir moins de résultats qu'initialement montré, juste en changeant le type de champ? Ne devrait-il pas y avoir une clause «WHERE» pour réduire les réponses retournées, si elle donne tous les résultats, alors qu'elle devrait en donner seulement quelques-uns? – vapcguy

3

Après réponse peut vous aider à

effectuer votre commande par date votre identifiant de date, mais utilisez la fonction to_char() dans la clause select et utiliser un autre identificateur dans la clause select pour la date

SELECT TO_CHAR(DISPDATE1,'DD/MM/YYYY') AS DISPDATE, 
SUM(APPLCOUNT) AS APPLIED, 
SUM(CONFCOUNT) AS CONFIRMED 
FROM 
    (
     SELECT COUNT(ID) AS APPLCOUNT, 
        0 AS CONFCOUNT, 
        STUDENT.APPLIED_ON AS DISPDATE1 
      FROM STUDENT 
      WHERE STUDENT.ID = P_ID 
      GROUP BY STUDENT.APPLIED_ON 
     UNION 
      SELECT 0 AS APPLCOUNT, 
        COUNT(ID) AS CONFCOUNT, 
        STUDENT.CONFIRMED_ON AS DISPDATE1 
      FROM STUDENT 
      WHERE STUDENT.ID = P_ID 
      GROUP BY STUDENT.CONFIRMED_ON 
    ) 
GROUP BY DISPDATE1 
ORDER BY DISPDATE1; 
+0

to_char et peut autre to_date (created_at, 'jj/mm/aaaa hh24: mi: ss') comme DISPDATE .. merci Brushan! Travail bien. – KingRider

10

Pas sûr ce que vous utilisez DBMS mais je le ferais de cette façon dans Microsoft SQL:

select  [date] 
from  tbemp 
order by cast([date] as datetime) asc 
+2

Cela a fonctionné pour moi, merci – Tyler

1

Cela peut vous aider dans mysql, php.

//your date in any format 
$date = $this->input->post('txtCouponExpiry'); 

$day = (int)substr($date, 3, 2); 
$month = (int)substr($date, 0, 2); 
$year = (int)substr($date, 7, 4); 

$unixTimestamp = mktime(0, 0, 0, $year, $day, $month); 

// insert it into database 
'date'->$unixTimestamp; 

//query for selecting order by date ASC or DESC 
select * from table order_by date asc; 
1

essayer cette

Order by Convert(datetime,@date) desc 
3

SELECT CONVERT (char (19), CAST (date AS datetime), 101) [date]
DE tbemp ORDER BY convert (datetime, date, 101) ASC

1

Je voulais éditer plusieurs événements dans l'ordre descendant chonologic, et je viens de faire un:

select 
TO_CHAR(startdate,'YYYYMMDD') dateorder, 
TO_CHAR(startdate,'DD/MM/YYYY') startdate, 
... 
from ... 
... 
order by dateorder desc 

et cela fonctionne pour moi. Mais sûrement pas adapté pour chaque cas ... Espérons juste que ça va aider quelqu'un!

5

cela fonctionne pour moi:

SELECT datefield FROM myTable ORDER BY CONVERT(DATE, datefield) ASC

2

Essayez d'utiliser ce ce travail pour moi

select * from `table_name` ORDER BY STR_TO_DATE(start_date,"%d-%m-%Y") ASC 

start_date est le nom du champ